如何修复无效的 JSON:破坏每个解析器的 7 个错误
JSON 解析听起来微不足道,直到部署前五分钟一个单一的杂散字符破坏了您的构建。 JSON 是故意严格的,比 JavaScript 更严格,这正是来自 JS 的开发人员不断陷入困境的原因。好消息是,几乎每个“无效 JSON”错误都是七个常见错误之一。学会识别它们,大多数损坏的 JSON 距离有效只有一个字符。
1. 尾随逗号(罪魁祸首)
这是最常见的 JSON 错误。 JavaScript 允许您在对象或数组中的最后一项后留下逗号; JSON,根据其 RFC 8259 规范,没有。因此,{"name": "Alice", "age": 30,} 是无效的,因为 30 后面有逗号,并且 ["a", "b",] 出于同样的原因也是无效的。修复方法只是删除最终属性或数组元素后面的逗号。从手工编辑配置文件的初级人员到粘贴 JavaScript 代码片段的高级人员,每个人都会遇到这个问题。
2.单引号代替双引号
JSON 需要将键和字符串值用双引号括起来。单引号在 JavaScript 和 Python 中有效,但在 JSON 中无效。所以 {'name': 'Alice'} 无效;它必须是{"name": "Alice"}。当您的有效负载来自 JavaScript console.log 或 Python 的 str() 输出时,通常会发生这种情况。单引号到双引号的查找和替换通常有效,但要注意字符串内的撇号,“it's”会损坏,因此解析器感知的修复更安全。
3. 不带引号的键
在 JavaScript 中,您可以编写不带引号的对象键:{name: "Alice"}。 JSON 不允许这样做,每个键都必须是双引号字符串。所以 {name: "Alice"} 必须变成 {"name": "Alice"}。这是将 JavaScript 对象文字直接复制到 JSON 上下文中的另一个症状。
4. 括号缺失或不匹配
每个左大括号都需要一个右大括号,每个左方括号都需要一对。当它们不匹配时,您会收到可怕的“JSON 输入意外结束”。在大文件中,这些内容很难用肉眼发现,这是一个可以漂亮打印和突出显示括号匹配的格式化程序赖以生存的地方,不匹配的括号在结构缩进的那一刻就会跳出来。
5. 评论
JSON 没有注释。不是 // 行注释,也不是块注释。如果您添加注释来解释字段,解析器将拒绝整个文件。 VS Code 的设置使用名为 JSONC 的变体,允许注释,并且有一个名为 JSON5 的超集,允许注释、单引号和尾随逗号,但标准解析器(如 JSON.parse、Python 的 json 模块)和大多数服务器库仅接受严格的 JSON。对于需要注释的配置文件,YAML 或 JSONC 是比弯曲 JSON 更好的选择。
6. JavaScript 值不是有效的 JSON
JavaScript 中存在三个值,但 JSON 中不存在:undefined、NaN 和 Infinity。如果您的数据源生成了其中之一(在序列化包含失败的数字转换的对象时很常见),则结果是无效的 JSON。修复方法是将它们替换为 null(相当于“无值”的 JSON)或合理的默认值。该错误通常位于上游,即生成数据的位置,而不是 JSON 本身。
7. 字符串中的未转义字符
JSON 字符串中的某些字符必须使用反斜杠进行转义。原始换行符、制表符或文字反斜杠将导致解析失败。因此,像“C:\Users\Alice”这样的 Windows 路径是无效的,反斜杠必须加倍为“C:\\Users\\Alice”,并且字符串内的真正换行符必须写为 \n。这些在许多编辑器中是看不见的,这使得他们很难找到。
最快的调试工作流程
最糟糕的 JSON 错误消息只是“无效的 json”,没有位置。一个好的验证器会做三件事:告诉你哪里出了问题,告诉你哪里出了问题(行和列),并显示周围的上下文。最快的工作流程是将文件粘贴到验证器中,读取它指向的行,然后检查其上方的行,因为解析器通常只有在遇到下一个标记时才意识到有问题,因此第 4 行缺少逗号在第 5 行显示为错误。如果错误指向位置 0,请检查左括号之前的字节顺序标记或杂散文本。
防止无效的 JSON
三个习惯可以避免大多数 JSON 问题。如果没有尊重语法的工具,切勿手动编辑大型 JSON 文件。保存时进行漂亮打印,因为结构错误在缩进的 JSON 中很明显,并且隐藏在紧凑的单行中。在提交之前进行验证,在 CI 管道中进行简单的检查可以在语法错误到达任何环境之前捕获它们。大多数损坏的 JSON 是有效的一个字符;诀窍是尽早抓住那个角色。