這不是一個完整的答案,但要注意零是Common Lisp中的經典假值,但也可用於許多其他的東西。符號t是規範的真實值,即使任何非零值也將是一個真正的值。這牛逼被序列化爲JSON真正的字面從雅鬆文檔的例子顯示:
CL-USER> (yason:encode
(list (alexandria:plist-hash-table
'("foo" 1 "bar" (7 8 9))
:test #'equal)
2 3 4
'(5 6 7)
t nil)
*standard-output*)
[{"foo":1,"bar":[7,8,9]},2,3,4,[5,6,7],true,null]
(#<HASH-TABLE :TEST EQUAL :COUNT 2 {59942D21}> 2 3 4 (5 6 7) T NIL)
如果空被視爲由JSON消費者一個假值,標準行爲與t和零可能已足夠供您使用。
作爲另一種選擇,你可以映射你的假布爾值(即零爲布爾時),以雅鬆:提前虛假。符號雅鬆:真和雅鬆:假映射到布爾正如你所期望:
CL-USER> (yason:encode t)
true
;=> T
CL-USER> (yason:encode nil)
null
;=> NIL
CL-USER> (yason:encode 'yason:true)
true
;=> YASON:TRUE
CL-USER> (yason:encode 'yason:false)
false
;=> YASON:FALSE
如果你有興趣我是如何發現這個(我以前從未使用過雅鬆)我用Quicklisp安裝了YASON,然後使用Slime檢查了yason:編碼。我發現,它與多種方法的通用功能定義:
(DEFGENERIC YASON:ENCODE (YASON::OBJECT &OPTIONAL STREAM))
(DEFMETHOD YASON:ENCODE (EQL()))
(DEFMETHOD YASON:ENCODE (EQL T))
(DEFMETHOD YASON:ENCODE (EQL NULL))
(DEFMETHOD YASON:ENCODE (EQL YASON:FALSE))
(DEFMETHOD YASON:ENCODE (EQL YASON:TRUE))
(DEFMETHOD YASON:ENCODE LIST)
(DEFMETHOD YASON:ENCODE VECTOR)
(DEFMETHOD YASON:ENCODE HASH-TABLE)
(DEFMETHOD YASON:ENCODE INTEGER)
(DEFMETHOD YASON:ENCODE FLOAT)
(DEFMETHOD YASON:ENCODE RATIO)
(DEFMETHOD YASON:ENCODE STRING)
您可以檢查的這些獨特的來源,但方法上(EQL())(即(EQL源NIL))和(eql YASON:FALSE)是重要的。
我正在尋找實現[this]的Common Lisp版本(http://todobackend.com/specs/index.html?http://todo-backend-sinatra.herokuapp.com/todos),它在特定的對象子字段中要求'false',所以我必須在適當的地方使用'yason:false'。 – Inaimathi
@Inaimathi當然,根據對象是什麼,你也可以定義一個對象類型的方法來直接對它進行序列化。然後,您仍然可以使用Common Lisp代碼中的常規值。 –