This fairly simple patch seems to enable encode-json to handle alists.<br><br>After applying:<br><br>;; handles alists<br>(defvar *foo* '((a . 1) (b . 2) (c . 3)))<br>(encode-json-to-string *foo*)<br>--> "{\"a\":1,\"b\":2,\"c\":3}"
<br><br>;; normal lists still work<br>(defvar *bar* '(1 2 3 4 5))<br>(encode-json-to-string *bar*)<br>--> "[1,2,3,4,5]"<br><br>;; messed up lists of alists which contain lists also works now<br>(defvar *baz* '(((a . 1) (b .2) (c . 3) (d . (1 2 3 4 5)))))
<br>(encode-json-to-string *baz*)<br>--> "[{\"a\":1,\"b\":[0.2],\"c\":3,\"d\":[1,2,3,4,5]}]"<br><br>;; even better, decode-json likes the output<br>(decode-json-from-string "[{\"a\":1,\"b\":[
0.2],\"c\":3,\"d\":[1,2,3,4,5]}]")<br>--> (((:A . 1) (:B 0.2) (:C . 3) (:D 1 2 3 4 5)))<br><br>One thing you can't do is encode a list appended to an alist. That won't work, and I don't know how you'd
<br>encode it in JSON anyway.<br><br>Someone who's had way more sleep than I have lately should test this as well. But I can now both encode<br>and decode lists of alists, which scratches my particular itch...<br><br>
Nathan<br><br>diff -rN -u old-cl-json/src/encoder.lisp new-cl-json/src/encoder.lisp<br>--- old-cl-json/src/encoder.lisp    2007-03-21 23:29:22.000000000 -0400<br>+++ new-cl-json/src/encoder.lisp    2007-03-21 23:29:22.000000000
 -0400<br>@@ -25,6 +25,12 @@<br>     (t (write-json-string (funcall *symbol-to-string-fn* s) stream))))<br> <br> (defmethod encode-json((s sequence ) stream)<br>+  (if (and (consp (car s))<br>+           (atom (cdar s)))<br>
+    (encode-json-alist s stream)<br>+    (encode-json-list s stream)))<br>+<br>+(defun encode-json-list (s stream)<br>   (let ((first-element t))<br>     (write-char #\[ stream)    <br>     (map nil #'(lambda (element)
<br><br>