2017-02-27 128 views
2

我正在尝试使用yason库来编码API端点的某些数据。这里的返回值的某些部分将会是布尔值。问题是如何使用yason编码布尔值?

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> 

回答

3

这不是一个完整的答案,但要注意是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)是重要的。

+0

我正在寻找实现[this]的Common Lisp版本(http://todobackend.com/specs/index.html?http://todo-backend-sinatra.herokuapp.com/todos),它在特定的对象子字段中要求'false',所以我必须在适当的地方使用'yason:false'。 – Inaimathi

+1

@Inaimathi当然,根据对象是什么,你也可以定义一个对象类型的方法来直接对它进行序列化。然后,您仍然可以使用Common Lisp代码中的常规值。 –