我正在尝试使用yason
库来编码API端点的一些数据。这里返回值的某些部分将是布尔值。问题是
cl-user> (yason:encode nil)
null
NIL
cl-user>
根据他们的文档,有a flag named *parse-json-booleans-as-symbols*
,但似乎没有编码的反转。 (并且相应的符号似乎没有适当地自动编码)。
cl-user> (yason:encode 'true)
"true" ;; expected `true` rather than `"true"`
"true"
cl-user> (yason:encode 'false)
"false" ;; expected `false` rather than `"false"`
"false"
cl-user>
答案 0 :(得分:3)
这不是一个完整的答案,但请注意 nil 是Common Lisp中的规范假值,但也用于许多其他事情。符号 t 是规范的真值,即使任何非零值也是真值。 YASON文档中的示例显示 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使用者将 null 视为false值,则 t 和 nil 的标准行为可能足以供您使用
作为另一种选择,你可以提前将你的假布尔(即 nil 用作布尔值时)映射到 yason:false 。符号 yason:true 和 yason:false 按照您的预期映射到布尔值:
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
如果您对我如何发现这一点感兴趣(我以前从未使用过YASON),我使用Quicklisp安装YASON,然后使用Slime检查 yason:encode 。我发现它是一个泛型函数,定义了许多方法:
(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))和<的方法来源< strong>(eql YASON:FALSE)是重要的。