如何在使用cl-json时输出false

时间:2014-12-28 18:47:06

标签: json lisp common-lisp

在Common Lisp中,我使用cl-json输出json格式,但是如何输出false而不是null

1 个答案:

答案 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数据,保留nullfalse之间的区别:

* (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