【问题标题】:How to access object decoded from JSON by cl-json?如何访问由 cl-json 从 JSON 解码的对象?
【发布时间】:2016-01-21 21:44:34
【问题描述】:

我正在尝试在 Common Lisp 中导入 JSON。我想出了如何从 JSON 字符串中解码对象,但我不知道如何访问返回的对象的属性。要解码一个字符串(并将结果存储在 ***tempjson** 中),我这样做:

(defun test-json ()
 (with-input-from-string
   (s "{\"foo\": [1, 2, 3], \"bar\": true, \"baz\": \"!\"}")
    (defparameter *tempjson* (json:decode-json s))))

如何访问 *tempjson* 数据。例如,如何获取 foo 属性的值?

【问题讨论】:

  • 不清楚你在问什么。如果你可以将一个流传递给decode-json,你能不能传递一个由with-open-file创建的流?
  • 我不完全明白你的意思。我试图在解码后获取 foo 的值。例如,如果我要使用哈希表,它会是 (gethash 'foo tempjson) 但我不知道在这种情况下的等价物。
  • 您的问题标题是“使用 cl-json Common Lisp 解码 JSON 文件”。看起来答案类似于(with-open-file (s "some-file") (json:decode-json s))。在您的问题中,您说您“似乎无法访问创建的 JSON 文件”。你在说什么文件? *tempjson* 不是一个文件,它是一个变量,而且你还没有向我们展示它的值。如果你运行test-json,然后评估*tempjson*,你会得到什么?
  • 根据您接受的答案和您对问题的 cmets,我对问题进行了一些编辑,以反映您实际上正在尝试做的事情。可以看看是不是合适的描述?
  • 是的,好多了。谢谢。答案很有效。

标签: json lisp common-lisp


【解决方案1】:

decode-json 似乎返回了一个关联列表(至少在这种情况下;参见documentation)。您可以使用函数assoc 访问这些值:

(defun test-json ()
  (with-input-from-string (s "{\"foo\": [1, 2, 3], \"bar\": true, \"baz\": \"!\"}")
    (let ((data (json:decode-json s)))
      (format t "~a~%" (rest (assoc :foo data))))))

【讨论】:

  • 那行得通,我不知道 assoc 是什么,在任何地方都找不到。
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 2012-06-06
相关资源
最近更新 更多