📅 2026-03-24⏱ 阅读约 10 分钟👤 适合所有开发者
本文目录
- 错误1:尾随逗号
- 错误2:使用单引号
- 错误3:键名不加引号
- 错误4:字符串内未转义双引号
- 错误5:使用 undefined
- 错误6:添加注释
- 错误7:数字格式不合法
- 错误8:括号不匹配
- 错误9:字符串包含未转义换行
- 错误10:日期格式误用
- 如何快速定位错误
JSON 语法极其严格,一个多余的逗号、一个单引号,都会导致整段 JSON 无法解析。本文详细分析 10 种最常见的 JSON 错误,每种都附有错误代码、原因解释和修复方法,帮助你快速排查和解决问题。
💡 遇到 JSON 报错时,最快的方式是把数据粘贴到 JSON 验证工具 中,它会精确指出错误位置。
错误1:尾随逗号(Trailing Comma)
这是最最常见的 JSON 错误,尤其对 JavaScript 开发者来说——因为 JS 对象和数组是允许尾随逗号的,习惯了 JS 写法的开发者很容易把这个习惯带到 JSON 里。
规则: JSON 对象的最后一个键值对后面、数组的最后一个元素后面,绝对不能有逗号。
❌ 错误写法
{
"name": "张三",
"age": 28,
"city": "北京", ← 多余的逗号!
}
✅ 正确写法
{
"name": "张三",
"age": 28,
"city": "北京" ← 最后一项不加逗号
}
数组同理:
❌ 错误写法
["苹果", "香蕉", "橙子",]
✅ 正确写法
["苹果", "香蕉", "橙子"]
如果你在使用 JSON5、JSONC 等 JSON 扩展格式,它们允许尾随逗号,但标准 JSON 不行。
错误2:使用单引号
JSON 规范明确要求字符串必须使用双引号,单引号在任何情况下都不合法——无论是键名还是字符串值。
❌ 错误写法
{'name': '张三', 'age': 28}
✅ 正确写法
{"name": "张三", "age": 28}
这个错误在从 Python 代码中复制数据时特别常见,因为 Python 字典默认使用单引号打印。解决方法是在 Python 中使用 json.dumps(data) 来序列化,而不是直接用 str(data) 或 print(data)。
错误3:键名不加引号
JavaScript 对象的键名可以不加引号(如 {name: "张三"}),但 JSON 要求键名必须是双引号字符串,这是两者的重要区别之一。
❌ 错误写法(JavaScript 对象字面量写法)
{name: "张三", age: 28, isAdmin: true}
✅ 正确写法(JSON 格式)
{"name": "张三", "age": 28, "isAdmin": true}
错误4:字符串内含有未转义的双引号
如果字符串的内容本身包含双引号,必须用反斜杠 " 进行转义,否则 JSON 解析器会误认为字符串提前结束了。
❌ 错误写法
{"message": "他说 "你好" 然后离开了"}
✅ 正确写法
{"message": "他说 "你好" 然后离开了"}
同理,反斜杠本身也需要转义:
❌ 错误写法
{"path": "C:\Users\zhangsan\Documents"}
✅ 正确写法
{"path": "C:\Users\zhangsan\Documents"}
💡 使用 JSON 转义工具 可以一键处理所有需要转义的字符,避免手动操作出错。
错误5:使用 undefined
undefined 是 JavaScript 特有的值,JSON 规范中根本不存在这个概念。如果你的数据有"无值"的情况,应该用 null 替代。
❌ 错误写法
{"name": "张三", "nickname": undefined, "phone": undefined}
✅ 正确写法
{"name": "张三", "nickname": null, "phone": null}
⚠️ 注意:在 JavaScript 中,JSON.stringify() 会直接忽略值为 undefined 的字段(而不是转成 null),这可能导致意外的数据丢失。
错误6:添加注释
JSON 完全不支持任何形式的注释,这是很多开发者没想到的。配置文件里加注释的需求非常常见,但标准 JSON 做不到。
❌ 错误写法
{
// 用户基本信息
"name": "张三",
"age": 28, /* 年龄字段 */
"role": "admin"
}
✅ 正确写法
{
"name": "张三",
"age": 28,
"role": "admin"
}
如果你确实需要注释,可以考虑以下替代方案:
- JSONC(JSON with Comments):VS Code 的
settings.json使用这种格式,支持//注释 - JSON5:JSON 的超集,支持注释、尾随逗号、单引号等
- YAML:支持
#注释,适合配置文件 - 约定字段:在 JSON 中用
"_comment"这样的特殊字段名作为注释(不推荐,但某些场景可用)
我们的 JSON格式化工具 支持智能识别并自动剥离 // 注释,让含注释的 JSON 也能正常格式化。
错误7:数字格式不合法
JSON 对数字格式有严格要求,以下写法均不合法:
❌ 错误写法
{
"hex": 0xFF, // 不支持十六进制
"octal": 0755, // 不支持八进制
"leadingZero": 07, // 不允许前导零
"nan": NaN, // NaN 不是 JSON 值
"pos_inf": Infinity, // Infinity 不是 JSON 值
"neg_inf": -Infinity // -Infinity 不是 JSON 值
}
✅ 正确写法
{
"hex": 255,
"octal": 493,
"leadingZero": 7,
"nan": null,
"pos_inf": null,
"neg_inf": null
}
错误8:括号不匹配
大型 JSON 数据中,嵌套层级深,括号容易不匹配。常见情况:多了一个闭合括号,或者少了一个。
❌ 错误写法
{
"user": {
"name": "张三",
"address": {
"city": "北京"
}
}
}} ← 多了一个 }
这类错误靠肉眼很难发现,最有效的方法是使用格式化工具——它会立即标出错误位置。
错误9:字符串包含未转义的换行符
JSON 字符串必须在一行内表示,不能直接包含字面量换行符(回车/换行)。如果字符串内容需要换行,必须使用 \n 转义。
❌ 错误写法(字符串内包含实际换行)
{"address": "北京市
朝阳区"}
✅ 正确写法
{"address": "北京市\n朝阳区"}
错误10:日期格式误用
JSON 没有原生的日期类型,日期只能用字符串或数字(Unix 时间戳)表示。直接写 JavaScript 的 Date 对象是无效的。
❌ 错误写法
{"createdAt": Date("2024-01-15")}
✅ 正确写法(ISO 8601 字符串,推荐)
{"createdAt": "2024-01-15T10:30:00Z"}
✅ 正确写法(Unix 时间戳)
{"createdAt": 1705312200}
如何快速定位和修复 JSON 错误
方法1:使用在线验证工具(最推荐)
将 JSON 粘贴到 JSON验证工具 中,它会立即显示:错误类型、发生错误的行号和列号,大幅减少手动排查时间。
方法2:查看错误信息
浏览器控制台或后端日志中的 JSON 解析错误通常会告诉你问题位置:
// 浏览器 JSON.parse() 报错
SyntaxError: Unexpected token } in JSON at position 47
// Python json.loads() 报错
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 5 column 3 (char 47)
根据错误信息中的位置(行号、列号或字符偏移量),直接跳到对应位置检查。
方法3:二分法排查
对于超大 JSON,可以用"二分法"快速定位:先取前一半数据验证,如果无误说明问题在后半段;再取后半段的前一半验证……以此类推,迅速缩小范围。
方法4:代码生成 JSON
不要手写 JSON,而是在代码中构建数据结构后用库序列化。例如 JavaScript 的 JSON.stringify(obj)、Python 的 json.dumps(dict),这些库会自动处理所有转义和格式问题。