2017-02-27 73 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代碼中的常規值。 –