From henrik at evahjelte.com Thu May 20 10:18:06 2010 From: henrik at evahjelte.com (Henrik Hjelte) Date: Thu, 20 May 2010 12:18:06 +0200 Subject: [cl-json-devel] How to get a JS false from cl-json? Message-ID: This question got stuck in mailman, From: Kenneth Tilton To: cl-json-devel at common-lisp.net Date: Wed, 19 May 2010 16:14:31 -0400 Subject: How to get a JS false from cl-json? t changes to unquoted true nicely, how about something that becomes false? I see there is a choice between null and false so we cannot just do false all the time. nice lib, btw. kt And the answer is: There are 3 different encoders. With the "streaming" encoder you have full control of the output. The guessing encoder (default) tries to make a decent json representation of a s-expression, it does not discriminate between null and false. The pretty new explicit encoder gives more control over the json representation, using a keyword in the first position of a list: (test explicit-encoder (is (string= "true" (with-explicit-encoder (encode-json-to-string '(:true)))) "True") (is (string= "false" (with-explicit-encoder (encode-json-to-string '(:false)))) "False") (is (string= "null" (with-explicit-encoder (encode-json-to-string '(:null)))) "False") There is a convenience function json-bool to make the keyword represenation: (test json-bool (is (equal (json-bool t) '(:true))) (is (equal (json-bool 1) '(:true))) (is (equal (json-bool nil) '(:false)))) Also a related question is how to encode an empty list. As an empty json object {}, empty json-list [] or as json-null? That can also be handled with the explicit encoder. Here is a sample how a complex json structure can be built (from testencoder.lisp) (sample-2-plists `(:object :method some-function :id 1 :params (:list (:json "{\"id\":\"barId\",\"name\":\"bar\"}") (:true) (:list (:object "name" a :id b)) (:list (:object :name foo :id foo-id)) ))) (correct-json " {\"method\":\"someFunction\", \"id\":1,\"params\": [{\"id\":\"barId\",\"name\":\"bar\"}, true, [{\"name\":\"a\",\"id\":\"b\"}], [{\"name\":\"foo\",\"id\":\"fooId\"}]]}") /Henrik Hjelte