修复 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)。压缩不会删除字符串值内部的空格。比较原文和格式化后的文本可以发现空白的变化,但重新格式化可能产生大量逐行差异。