2016-01-21 42 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