这不是一个完整的答案,但要注意零是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代码中的常规值。 –