使用cl-json解码JSON时,如何将plist键转为符号而非字符串?
解决cl-json解码JSON时键为带
*符号的问题 我之前也碰到过cl-json这个默认的符号命名问题,别担心,这是库自带的标识符转换规则导致的,咱们可以通过调整参数或者全局配置轻松解决。
为什么会得到:*HELLO?
cl-json默认的标识符转换逻辑会给JSON键名加上*前缀,主要是为了兼容那些不符合Lisp符号命名规范的键(比如带空格、特殊字符的键名)。但对于像"Hello"这种合法的名称,我们可以修改规则来生成更干净的符号。
解决方法
方法一:单次调用时指定转换规则
在调用decode-json-from-string时,通过:keyword-normalizer参数传入自定义的转换函数,比如直接转成大写:
(decode-json-from-string "{\"Hello\": \"world\"}" :keyword-normalizer #'string-upcase)
执行后会得到你想要的结果:(:HELLO "world"),键是标准的关键字符号。
方法二:全局设置默认转换规则
如果希望所有的JSON解码操作都使用这个规则,可以设置全局变量*json-identifier-name-to-lisp*:
(setf cl-json:*json-identifier-name-to-lisp* #'string-upcase)
之后再调用decode-json-from-string处理{"Hello": "world"},就会默认生成:HELLO作为键了。
额外:生成普通符号而非关键字
如果你需要的是普通符号(不是关键字),可以结合:symbol-keywords参数设置为nil:
(decode-json-from-string "{\"Hello\": \"world\"}" :keyword-normalizer #'string-upcase :symbol-keywords nil)
这样会得到(HELLO . "world")的关联列表(alist),键是普通符号。
内容的提问来源于stack exchange,提问作者Rick Anaconda
相关产品推荐
相关产品推荐

