在Common Lisp中,我使用cl-json输出json格式,但是如何输出false
而不是null
?
答案 0 :(得分:4)
当我需要使用cl-json正确处理false
时,这是我使用的一组实用程序:
(defclass json-false ()
())
(defmethod json:encode-json ((object json-false) &optional stream)
(princ "false" stream)
nil)
(defvar *json-false* (make-instance 'json-false))
(defun json-bool (val)
(if val t *json-false*))
(defun json-bool-handler (token)
(or (string= token "true")
(and (string= token "false") *json-false*)))
(defmacro preserving-json-boolean (opts &body body)
(declare (ignore opts))
`(let ((json:*boolean-handler* #'json-bool-handler))
,@body))
现在,为了对文字false
进行编码,我想
* (json:encode-json-to-string `((foo . nil) (bar . t) (baz . ,*json-false*)))
"{\"foo\":null,\"bar\":true,\"baz\":false}"
或者,将LISP布尔值编码为json布尔值:
* (let ((something nil))
(json:encode-json-to-string `((bool . ,(json-bool something)))))
"{\"bool\":false}"
或者,要读入JSON数据,保留null
和false
之间的区别:
* (preserving-json-boolean ()
(json:decode-json-from-string "{\"foo\":null,\"bar\":true,\"baz\":false}"))
((:FOO) (:BAR . T) (:BAZ . #<JSON-FALSE #x21029D2E4D>))
当然,在阅读这样的数据时必须要小心;
* (when (cdr (assoc :baz *))
'yep)
YEP