2017-02-27 1 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では標準的な偽の値ですが、また、他のものの多くに使用することに注意してください。任意の0以外の値もまた真の値であるにもかかわらず、シンボルtは標準的な真の値です。 トンはJSON真リテラルとしてシリアル化されていることをYASONドキュメントのショーからの例:

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) 

nullの場合は、JSONの消費者による偽の値、を持つ標準的な動作として扱われますtnilで十分です。

別の選択肢として、あなたはあなたの偽のブール値をマッピングすることができ(すなわち、ブール値として使用ゼロyasonに:事前に偽。シンボルyason:真とyasonは:ブール偽マップは、あなたが期待するよう:

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をインストールし、スライムを使用して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))、(eql YASON:FALSE)が重要でした。

+0

私は[this](http://todobackend.com/specs/index.html?http://todo-backend-sinatra.herokuapp.com/todos)のCommon Lispバージョンを実装しようとしています。特定のオブジェクトサブフィールドで 'false'を要求するので、' yason:false'を適切な場所で使用する必要があります。 – Inaimathi

+1

@Inaimathiそのオブジェクトが何であるかに応じて、もちろん、それを直接シリアル化するオブジェクト型のメソッドを定義することもできます。それでは、Common Lispコード内の従来の値を使用することができます。 –

関連する問題