JSON格式化与校验:语法错误到底出在哪

大多数"JSON坏掉了"的问题,其实都源于违反了几条并不复杂的语法规则。

键名必须是双引号包裹的字符串

JSON要求键和字符串值都必须用双引号,不同于JavaScript对象字面量,JSON里不加引号的键名或用单引号都是无效语法而不仅仅是风格问题。

不允许出现结尾多余的逗号

对象或数组最后一项后面多加一个逗号,是JSON解析失败最常见的原因之一,尤其是从JS代码里复制过来时容易忽略。

可用的值类型是有限的

只能是字符串、数字、布尔值(true/false)、null、对象或数组,undefined、函数、注释等都不是合法的JSON。

格式化和压缩只是同一份数据的两种呈现

带缩进的格式化是为了方便人阅读,压缩(minify)则是去掉多余空白以减小体积,便于传输,两者数据本身完全相同。

对象和数组可以自由嵌套

这也是JSON能表示像API响应这样复杂层级数据结构的原因。

为什么JSON的语法要设计得这么严格

JSON最初的设计目标就是做一种简单、没有歧义的数据交换格式,严格的语法保证了不同解析器之间的行为完全一致。

JSON报错通常来自哪里

手动编辑的配置文件、从JS或Python代码里直接复制粘贴(引号规则不同)、多余的结尾逗号,以及JSON本身并不支持的//注释,是绝大多数校验失败的来源。

常见问题

JSON里可以写注释吗?

标准JSON不支持任何注释语法,除非使用JSON5、JSONC等扩展格式,否则写入//或/* */都会被校验器判定为错误。

为什么代码在JavaScript里能正常运行,校验JSON时却报错?

JS对象字面量的语法比JSON宽松得多,比如允许不加引号的键名、末尾逗号等,这些是JS自身的语法特性,并不代表它们是合法的JSON。