[cl-json-devel] bug report
Boris Smilga
boris.smilga at gmail.com
Sun Jun 5 21:53:20 UTC 2011
On 5 Jun 2011, at 23:47, Nicolas Martyanoff wrote:
> The following form breaks when evaluated:
>
> (json:encode-json-to-string '((:a . ((:b . ((:c . 42)))))))
>
> Help! 11 nested errors. SB-KERNEL:*MAXIMUM-ERROR-DEPTH* exceeded.
Hello. That's expected behaviour (sort of).
Essentially, when ENCODE-JSON is passed a cons cell, it has no way of
telling whether the cell is the head of A) an alist (which should be
encoded as a JSON Object), or B) of a proper list which is not an
alist (which should be encoded as a JSON Array), or C) of an improper
list (which is unencodable and so should produce an error). So it
tries the option B first, and, if that fails, the option A. In your
case, this situation is reproduced on every level of nesting. The
problem is that SB-KERNEL:*MAXIMUM-ERROR-DEPTH* is quite shallow by
default (10), and the try-proper-list-fall-back-to-alist approach
results in a layering of nested conditions which is deeper than that
number. Writing, e. g.,
(let ((sb-kernel:*maximum-error-depth* 20))
(json:encode-json-to-string '((:a . ((:b . ((:c . 42))))))))
produces the correct result, "{\"a\":{\"b\":{\"c\":42}}}" .
I know this is not a sustainable approach, but at this moment I have
no good idea how to modify CL-JSON to get around this issue. Your
best options at this moment would be to use either CLOS objects
instead of alists, or the explicit encoder from the repository version:
(json:with-explicit-encoder
(json:encode-json-to-string
'(:object :a (:object :b (:object :c 42)))))
or
(json:with-explicit-encoder
(json:encode-json-to-string
'(:object (:a . (:object (:b . (:object (:c . 42))))))))
Sincerely,
- B. Smilga.
More information about the cl-json-devel
mailing list