33.31 解析和生成 JSON 值

Emacs 对 JSONJavaScript 对象表示法)的支持提供了多个函数, 用于在 Lisp 对象和 JSON 值之间进行转换。任何 JSON 值都可转换为 Lisp 对象,但反之则不一定。 具体规则如下:

注意:nil 既是有效的关联列表也是有效的属性列表,它表示 {}(空 JSON 对象), 而非 nullfalse 或空数组—这些是不同的 JSON 值。

若某个 Lisp 对象无法转换为 JSON 格式,序列化函数会抛出类型为 wrong-type-argument 的错误。 解析函数还可能抛出以下错误:

json-unavailable

当解析库不可用时抛出。

json-end-of-file

当输入文本提前结束时抛出。

json-trailing-content

当解析完第一个 JSON 对象后仍遇到意外输入时抛出。

json-parse-error

当遇到无效的 JSON 语法时抛出。

顶层值及其内部的子对象均可序列化为 JSON。同样,解析函数会返回上述所有可能的类型。

Function: json-serialize object &rest args

该函数返回一个新的 Lisp 单字节字符串,其中包含 object 的 JSON 表示形式。 参数 args 是一组关键字/参数对,支持以下关键字:

:null-object

该值指定用于表示 JSON 关键字 null 的 Lisp 对象,默认为符号 :null

:false-object

该值指定用于表示 JSON 关键字 false 的 Lisp 对象,默认为符号 :false

Function: json-insert object &rest args

该函数将 object 的 JSON 表示形式插入到当前缓冲区的光标位置之前。 参数 args 的解析规则与 json-serialize 相同。

Function: json-parse-string string &rest args

该函数解析 string 中的 JSON 值(string 必须是 Lisp 字符串)。 若 string 不包含有效的 JSON 对象,该函数会抛出 json-parse-error 错误。

参数 args 是一组关键字/参数对,支持以下关键字:

:object-type

该值指定用于表示 JSON 对象键值映射的 Lisp 对象类型:可选 hash-table(默认,使用字符串作为键的哈希表)、 alist(使用符号作为键的关联列表)或 plist(使用关键字符号作为键的属性列表)。

:array-type

该值指定用于表示 JSON 数组的 Lisp 对象类型:可选 array(默认,使用 Lisp 数组)或 list(使用列表)。

:null-object

该值指定用于表示 JSON 关键字 null 的 Lisp 对象,默认为符号 :null

:false-object

该值指定用于表示 JSON 关键字 false 的 Lisp 对象,默认为符号 :false

Function: json-parse-buffer &rest args

该函数从当前缓冲区的光标位置开始读取下一个 JSON 值。若读取到有效的 JSON 对象, 则将光标移动到该值的末尾位置;否则抛出 json-parse-error 错误且不移动光标。 参数 args 的解析规则与 json-parse-string 相同。