如何使用yason编码布尔值?

时间:2017-02-27 21:23:11

标签: json encoding common-lisp

我正在尝试使用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>

1 个答案:

答案 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)是重要的。