You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:52:33