常见的 JSON 语法错误以及如何使用校验器修复它们
常见的 JSON 错误
JSON 严格的语法规则意味着即使一个字符放错位置,也可能破坏整个文档。了解最常见的 JSON 错误可以帮助你更快地调试,并避免重复犯同样的错误。以下是开发者最常遇到的问题,每个都附有清晰的解释和修复方法。
1. 尾部逗号
错误: 对象或数组末尾出现 Unexpected token
在 JavaScript 对象和数组中允许尾部逗号,但在 JSON 中严格禁止。
无效的 JSON:
{
"name": "Alice",
"age": 30,
}
修复方法: 移除最后一项之后的逗号。
{
"name": "Alice",
"age": 30
}
带尾部逗号的数组:
// Invalid
[1, 2, 3,]
// Valid
[1, 2, 3]
2. 键周围缺少引号或引号不正确
错误: 出现 Unexpected identifier 或 Expected double-quoted property name
JSON 要求所有对象键都必须用双引号包裹。单引号和未加引号的键都是无效的,尽管它们在 JavaScript 中可以使用。
无效的 JSON:
{
name: "Alice",
'occupation': "Engineer"
}
修复方法: 始终用双引号包裹键。
{
"name": "Alice",
"occupation": "Engineer"
}
3. 字符串值使用单引号
错误: 出现 Unexpected identifier 或 Unterminated string
与键一样,JSON 中的字符串值也必须使用双引号。单引号无效。
无效的 JSON:
{ "greeting": 'Hello, world!' }
修复方法: 将单引号替换为双引号。
{ "greeting": "Hello, world!" }
提示: 如果字符串中包含双引号,请用反斜杠进行转义:"He said, \"Hello\""。
4. 未转义的特殊字符
错误: 出现 Unexpected token 或 Invalid character
JSON 字符串中某些字符必须进行转义:双引号(")、反斜杠(\)和控制字符。
无效的 JSON:
{
"path": "C:\Users\Documents\file.json",
"quote": "He said "hello""
}
修复方法: 正确转义反斜杠和双引号。
{
"path": "C:\\Users\\Documents\\file.json",
"quote": "He said \"hello\""
}
JSON 转义序列完整列表
| 序列 | 表示 |
|----------|-----------|
| \" | 双引号 |
| \\ | 反斜杠 |
| \/ | 正斜杠 |
| \b | 退格 |
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 制表符 |
| \uXXXX | Unicode 字符(例如 é 表示 e) |
5. 无效的数字格式
错误: 出现 Unexpected number 或 Invalid number
JSON 对数字的格式有特定规则:
- 不允许前导零(
01无效) - 仅数字
0允许单个前导零 - 数字不能有结尾的小数点(
10.无效) - 不支持十六进制、八进制和二进制格式
无效的 JSON:
{
"invalid1": 01,
"invalid2": 10.,
"invalid3": 0xFF,
"invalid4": 1,000
}
修复方法:
{
"valid1": 1,
"valid2": 10.0,
"valid3": 255,
"valid4": 1000
}
6. 无效的值:undefined、NaN、Infinity
错误: undefined、NaN、Infinity 会触发 Unexpected token
JavaScript 有一些在 JSON 中没有对应形式的值。它们会导致解析错误:
无效的 JSON:
{
"undefinedVal": undefined,
"notANumber": NaN,
"infinity": Infinity
}
修复方法: 替换为有效的 JSON 值,或使用某种约定。
{
"undefinedVal": null,
"notANumber": null,
"infinity": 1.7976931348623157e+308
}
7. 多余逗号或缺失逗号
错误: 出现 Expected comma 或 Unexpected token
JSON 中的逗号必须分隔每个键/值对和数组元素,但不能出现在最后一项之后。
缺失逗号(无效):
{
"name": "Alice"
"age": 30
}
修复方法: 添加缺失的逗号。
{
"name": "Alice",
"age": 30
}
8. 深层嵌套结构问题
错误: 出现 Maximum call stack size exceeded 或解析器超时
虽然这不是语法错误,但深层嵌套的 JSON(10 层以上)可能会导致性能问题,并使调试变得极其困难。
有问题的结构:
{
"level1": {
"level2": {
"level3": {
"level4": {
"level5": {
"level6": {
"value": "too deep"
}
}
}
}
}
}
}
更好的方法: 将结构扁平化,或使用引用。
{
"users": {
"alice": { "role": "admin" }
},
"permissions": {
"admin": ["read", "write", "delete"]
}
}
9. 缺少开括号或闭括号
错误: 出现 Expected ',' or '}' 或 Unexpected end of JSON input
不匹配的花括号和方括号是 JSON 错误的常见来源,尤其是在大型或手写的 JSON 文件中。
无效的 JSON:
{
"name": "Alice",
"items": [1, 2, 3
}
修复方法: 确保每个 { 都有对应的 },每个 [ 都有对应的 ]。
{
"name": "Alice",
"items": [1, 2, 3]
}
专业提示: 正确地缩进你的 JSON,以便直观地匹配开括号和闭括号。JSON 格式化工具可以自动完成这项工作。
如何有效调试 JSON 错误
- 使用 JSON 校验器 -- 将你的 JSON 粘贴到免费 JSON 校验器中,获得第一个错误的确切行和列。
- 增量校验 -- 对于大型文件,一次只校验一个部分,以隔离错误。
- 注意复制粘贴带来的瑕疵 -- 不可见字符、智能引号和不间断空格常常从文字处理器或网页中混入。
- 检查字符编码 -- 确保你的文件以 UTF-8 保存。其他编码可能产生不可见的错误。
- 使用 linter -- ESLint 等带
json插件的工具能在开发过程中捕获 JSON 错误。
请记住:JSON 解析器通常只报告第一个语法错误。修复它,重新校验,然后重复,直到文档通过。我们的 JSON Formatter & Validator 工具会提供即时、详细的错误消息,以加快这一过程。