2016-01-21 120 views
1

我想在Common Lisp中获取JSON导入。我想出了如何从JSON字符串中解码对象,但我不知道如何访问返回的对象的属性。为了解码一个字符串(和结果存储在*** tempjson **),我这样做:如何访问通过cl-json从JSON解码的对象?

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

如何访问* tempjson *数据。例如,我怎样才能得到属性值foo属性?

+0

您不清楚您要问什么。如果你可以传递一个流到decode-json,你能不能通过一个由open-file创建的流? –

+0

我不完全明白你的意思。我试图在解码后得到foo的值。例如,如果我要使用散列表,它将是(gethash'foo * tempjson *),但我不知道在这种情况下的等价物。 – phlie

+0

您的问题标题是“使用cl-json Common Lisp解码JSON文件”。它看起来像答案会像'(with-open-file(s“some-file”)(json:decode-json s))''。在你的问题中,你说你“似乎无法访问创建的JSON文件”。你在说什么文件? '* tempjson *'不是一个文件,它是一个变量,而且你没有向我们显示它的价值。如果你运行'test-json'然后评估'* tempjson *',你会得到什么? –

回答

6

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)))))) 
+0

这是有效的,我不知道是什么联合,无法在任何地方找到它。 – phlie