核心答案:JSON 六条铁律——键必须双引号、字符串必须双引号、不允许尾随逗号、不允许注释、值只能是 6 种类型(字符串/数字/布尔/null/对象/数组)、undefined 和函数不允许。90% 的解析错误源于前五条。
JSON 六条铁律
| 规则 | 正确 | 错误 |
|---|---|---|
| 键双引号 | {"a":1} | {a:1} |
| 字符串双引号 | "hi" | 'hi' |
| 无尾随逗号 | [1,2] | [1,2,] |
| 无注释 | — | {"a":1 /*x*/} |
| 合法值 | true/null/123 | undefined/NaN |
| 顶层类型 | 对象或数组(老标准) | — |
五大常见错误与修复
1. 单引号:{'name':'Tom'} → {"name":"Tom"}
2. 尾随逗号:从 JS 对象复制过来的数据最常见——删除最后一个元素后的逗号
3. 未转义的引号:"他说"你好"" → "他说\"你好\""(内层双引号加反斜杠)
4. 多余逗号/缺逗号:逐项检查相邻元素间的逗号数量
5. 非法值:JS 对象里的 undefined、function、Date 对象不能直接 JSON.stringify 后跨语言使用
格式化与压缩
| 操作 | 效果 | 场景 |
|---|---|---|
| 格式化(2 空格缩进) | 体积 +10-30% | 开发调试、配置文件 |
| 压缩(去空白) | 体积最小 | 生产传输、存储 |
JS:JSON.stringify(obj, null, 2) 格式化;JSON.stringify(obj) 压缩。
JSON 与 JS 对象的区别
| 特性 | JSON | JS 对象 |
|---|---|---|
| 键 | 必须双引号 | 可裸写 |
| 字符串 | 双引号 | 单双均可 |
| 尾随逗号 | 禁止 | 允许 |
| 注释 | 禁止 | 允许 |
| 函数/undefined | 禁止 | 允许 |
| 日期 | 只能字符串 | Date 对象 |
常见误区
- 把 JS 对象当 JSON 发:后端收到 {a:1} 报错——先 JSON.stringify。
- 大数精度丢失:JSON 数字超 2⁵³ 会失真,Long 型 ID 应传字符串。
- 循环引用 stringify:对象互相引用会抛 TypeError,先解环。
- 特殊字符不转义:换行要 \n、反斜杠要 \\,直接放原始字符破坏结构。
用[JSON 格式化工具](/c/dev/json-format)一键校验、格式化并定位错误行。