修复 JSON 错误,同时不改变数据的含义

格式化能让有效的 JSON 更易阅读,但损坏的输入需要先修正。请保留原文,从最近的具体语法问题入手,而不是一次性重写整个响应。

1. 确认输入的确是 JSON

检查你复制的是响应正文,而不是它的 URL、HTML 登录错误页或 JavaScript 语句。对象和数组并不是仅有的有效 JSON 值:字符串、数字、true、false 和 null 也都可以,尽管接收的 API 可能要求对象。

2. 检查引号和分隔符

属性名和字符串必须使用双引号。报告的位置是解析无法继续的地方,因此原因可能是它前面缺少一个逗号。每次只做一处小修改,然后重新验证。

无效输入修正后的输入修改
{'name':'Mina'}{"name":"Mina"}使用双引号
{"count":2,}{"count":2}删除末尾逗号
{"a":1 "b":2}{"a":1,"b":2}分隔各属性
{"ok":True}{"ok":true}字面量使用小写

3. 区分转义字符与格式化空白

在字符串内部,双引号要转义为 \",字面意义上的反斜杠要写成两个反斜杠。字符串值中的换行使用 \n 表示。属性之间的实际换行是格式化空白,而字符串内部未转义的换行是无效的。

随代码示例一起复制的 Markdown 反引号和说明文字也不属于 JSON。报告问题时,请把凭据和个人信息替换为虚构数据,并使用仍能复现问题的最小示例。

4. 找出可能丢失数字精度的环节

本格式化工具会保留 9007199254740993 和 1e3 这样的数字原文。但之后的程序如果把它们读成普通的 JavaScript 数字,大整数仍可能丢失精度。

对于需要精确的标识符,如果数据约定允许,请使用字符串。格式化无法恢复已被其他系统四舍五入的数字;还请对照原始响应以及解析或存储环节。

5. 分别检查重复键和数据结构

对于 {"id":1,"id":2},格式化工具会保留两个条目。下游软件可能只保留最后一个值,也可能拒绝该对象。请在源数据中确定哪个值才是正确的,而不是指望格式化替你选择。

语法检查通过后,请对照 API 约定或 JSON Schema 检查必填字段、类型、允许值和日期格式。语法有效的数据仍可能被目标服务拒绝。

6. 根据下一位读者选择输出

供人工审阅时使用两个或四个空格缩进,需要紧凑传输时使用压缩(Minified)。压缩不会删除字符串值内部的空格。比较原文和格式化后的文本可以发现空白的变化,但重新格式化可能产生大量逐行差异。

参考资料

立即使用工具