(json:with-decoder-simple-clos-semantics (let ((json:*json-symbols-package* nil)) (let ((x (json:decode-json-from-string "{"foo1": [1, 2, 3], "bar1": true, "baz1": "!"}"))) (with-slots (foo1 bar1 baz1) x (values x foo1 bar1 baz1)))))
The slot FOO1 is unbound in the object #<#<JSON:FLUID-CLASS NIL {1004085F33}> {1003CAFB43}>. [Condition of type UNBOUND-SLOT]
Олег.
On 22 Jan 2013, at 11:28, Олег wrote:
(json:with-decoder-simple-clos-semantics (let ((json:*json-symbols-package* nil)) (let ((x (json:decode-json-from-string "{"foo1": [1, 2, 3], "bar1": true, "baz1": "!"}"))) (with-slots (foo1 bar1 baz1) x (values x foo1 bar1 baz1)))))
The slot FOO1 is unbound in the object #<#<JSON:FLUID-CLASS NIL {1004085F33}> {1003CAFB43}>. [Condition of type UNBOUND-SLOT]
When Lisp slot names are derived from JSON object keys, they are transcribed to more Lisp-like conventions: camel case is replaced with hyphenation, all caps become framing asterisks, etc. So, slot names in your Lisp code should be written with hyphens:
(json:with-decoder-simple-clos-semantics (let ((json:*json-symbols-package* nil)) (let ((x (json:decode-json-from-string "{"foo1": [1, 2, 3], "bar1": true, "baz1": "!"}"))) (with-slots (foo-1 bar-1 baz-1) x (values x foo-1 bar-1 baz-1)))))
=> #<#<JSON:FLUID-CLASS NIL {5D03A341}> {5A1ECF11}>
=> #(1 2 3)
=> T =>"!"
If this disagrees too much with the conventions of your code, you can change the way identifiers are transcribed by setting / rebinding the variable *JSON-IDENTIFIER-NAME-TO-LISP* to the appropriate transcriber function.
Hope this helps.
— B. Smilga.