常见 JSON 错误及修复方法
JSON 语法错误故障排除完整指南。学习识别和修复最常见的 JSON 验证问题。
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# 常见 JSON 错误及修复方法
JSON 语法错误很容易犯,一旦知道要寻找什么,也很容易修复。本指南涵盖最常见的错误及解决方案。
错误 1:缺失或多余的逗号
逗号是 JSON 中最常见的错误来源。
❌ 错误的方式
缺少逗号:{
"姓名": "张三",
"年龄": 30
"城市": "北京"
}
多余的尾部逗号:
{
"姓名": "张三",
"年龄": 30,
}
多余的逗号在数组中:
{
"标签": ["json", "数据",]
}
✅ 正确的方式
{
"姓名": "张三",
"年龄": 30,
"城市": "北京"
}
{
"标签": ["json", "数据"]
}
修复技巧
- 每个值后面放逗号,除了最后一个
- 数组元素之间需要逗号
- 检查最后一个元素后没有逗号
错误 2:引号类型错误
JSON 只允许双引号,不允许单引号或其他引号类型。
❌ 错误的方式
{
'name': 'John'
}
{
"name": 'John'
}
{
name: "John"
}
✅ 正确的方式
{
"姓名": "张三"
}
常见原因
- 从 Python 或其他语言复制代码(单引号允许)
- 使用 HTML 中的直弯引号而不是编程引号
- 键没有引号
错误 3:未引用的属性名
在 JSON 中,所有键(属性名)必须用双引号引起来。
❌ 错误的方式
{
姓名: "张三",
年龄: 30
}
{
name: "John",
age: 30
}
✅ 正确的方式
{
"姓名": "张三",
"年龄": 30
}
为什么
JavaScript 允许无引号的键,但 JSON 不允许。始终引用您的键。
错误 4:未转义的特殊字符
在 JSON 字符串中,某些字符必须被转义(前面加反斜杠)。
❌ 错误的方式
{
"message": "他说 "你好""
}
{
"path": "C:UsersDocumentsile.json"
}
{
"quote": "他说 'Hello'"
}
✅ 正确的方式
{
"message": "他说 \"你好\""
}
{
"path": "C:\\Users\\Documents\\file.json"
}
JSON 中的转义序列
| 序列 | 字符 |
|------|------|
| \\" | 双引号 |
| \\ | 反斜杠 |
| \/ | 正斜杠 |
| \b | 退格符 |
| \f | 换页符 |
| \n | 换行 |
| \r | 回车 |
| \t | 制表符 |
| \uXXXX | Unicode 字符 |
错误 5:错误的数据类型
❌ 错误的方式
{
"年龄": "30",
"价格": $19.99,
"分数": 95.5%
}
✅ 正确的方式
{
"年龄": 30,
"价格": 19.99,
"分数": 95.5
}
JSON 允许的类型
- 字符串:
"文本" - 数字:
42、-3.14 - 布尔值:
true、false - null:
null - 数组:
[1, 2, 3] - 对象:
{ "键": "值" }
常见错误
- ❌ 数字用引号引起来:
"30" - ❌ 布尔值小写:
True、False - ❌ 未引用的日期:
2026-01-14
错误 6:缺少或多余的括号和括号
❌ 错误的方式
{
"users": [
{"name": "张三"},
{"name": "李四"}
]
} // 缺少一个括号
// 额外的括号
[["item"]]
// 混合括号
{"items": ["a", "b"}
✅ 正确的方式
{
"users": [
{"name": "张三"},
{"name": "李四"}
]
}
{
"items": ["a", "b"]
}
匹配规则
- 每个
{需要一个} - 每个
[需要一个] - 它们必须正确嵌套
错误 7:尾部逗号
❌ 错误的方式
{
"item1": "value1",
"item2": "value2",
}
["item1", "item2",]
✅ 正确的方式
{
"item1": "value1",
"item2": "value2"
}
["item1", "item2"]
为什么
JSON 不允许数组或对象末尾的逗号。这是常见的初学者错误。
错误 8:使用未定义或 NaN
JavaScript 支持 undefined 和 NaN,但 JSON 不支持。
❌ 错误的方式
{
"value": undefined,
"result": NaN,
"infinity": Infinity
}
✅ 正确的方式
{
"value": null,
"result": 0,
"infinity": null
}
JavaScript 中的解决方案
// 使用自定义 replacer 处理特殊值
const data = {
value: undefined,
result: NaN
};
const json = JSON.stringify(data, (key, value) => {
if (value === undefined || Number.isNaN(value)) {
return null;
}
return value;
});
错误 9:编码问题
❌ 错误的方式
包含非 UTF-8 编码的文件。
✅ 正确的方式
# 检查编码
file data.json
# 转换为 UTF-8
iconv -f ISO-8859-1 -t UTF-8 old.json > new.json
中文字符
{
"名字": "张三",
"城市": "北京"
}
错误 10:注释
JSON 不支持注释(虽然 JSON5 支持)。
❌ 错误的方式
{
"name": "张三", // 这是注释
"age": 30 # 不允许注释
}
✅ 正确的方式
使用 JSON5 或移除注释:
{
"name": "张三",
"age": 30
}
验证 JSON 的工具
在线工具
- 显示详细错误消息
- 指出确切的行号
- 处理大文件
- 实时验证
- 快速验证
- 即时反馈
命令行工具
# Python
python3 -m json.tool data.json
# jq
jq . data.json
# Node.js
node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync('data.json')), null, 2))"
IDE/编辑器
- VS Code: 内置 JSON 验证
- Sublime Text: JSONLint 插件
- WebStorm: 自动验证
常见错误排查清单
快速检查清单
□ 所有属性名都用双引号引起来?
□ 数字、布尔值和 null 没有引号?
□ 所有字符串都用双引号引起来?
□ 所有特殊字符都被转义了吗?
□ 逗号放在正确的位置?
□ 没有尾部逗号?
□ 括号和括号正确匹配?
□ 没有 undefined、NaN 或 Infinity?
□ 没有注释?
□ 文件编码是 UTF-8?
使用版本控制查找错误
# 检查最近的更改
git diff data.json
# 查看特定行号
git blame -L 10,20 data.json
# 比较版本
git diff HEAD~1 HEAD data.json
最佳实践防止错误
1. 使用工具生成 JSON
与其手动编写,不如在代码中生成:
Python:import json
data = {"name": "张三", "age": 30}
json_string = json.dumps(data)
JavaScript:
const data = {name: "张三", age: 30};
const json = JSON.stringify(data);
2. 在提交前验证
# Git pre-commit 钩子
python3 -m json.tool *.json || exit 1
3. 使用 Schema 验证
# 针对 Schema 验证 JSON
ajv validate -s schema.json -d data.json
4. 自动格式化
# 自动修复某些错误
jq . data.json > formatted.json
结论
常见的 JSON 错误很容易识别和修复,一旦您知道要寻找什么。记住:
- 始终 使用双引号
- 始终 引用属性名
- 避免 尾部逗号
- 验证 使用工具
- 使用 代码生成而不是手动编写
现在您可以自信地调试 JSON!