设备与系统问题
常见 JSON 错误:尾随逗号、引号与 Unexpected token
修复无效 JSON:尾随逗号、单引号、未加引号的键、Unexpected token。了解 JSON.parse 为何失败,以及如何校验 JSON。
多数 JSON 错误来自严格语法:尾随逗号、单引号、未加引号的属性名、漏掉的逗号、括号不匹配、非法转义,或注释。
JSON 看起来像 JavaScript 对象,但更严格。属性名和字符串必须用双引号。
看到 Unexpected token 时,标出的字符可能是解析停止的位置,不一定是最初出错的地方。
你的 JSON 被标为无效。通常是小语法问题,不是文件格式坏了。下面七种错误造成大多数 Unexpected token。
JSON 为什么这么容易出错?
JSON 是语法严格的数据格式。JavaScript 对象字面量可以长得很像,却仍不是有效 JSON。标准 JSON 里,属性名和字符串要用双引号,不允许尾随逗号,注释也不属于该格式。
1. 尾随逗号(Trailing Commas)
最后一个属性后面多出来的逗号就是问题。标准 JSON 不允许。
无效
{
"name": "Alex",
"age": 30,
}
有效
{
"name": "Alex",
"age": 30
}
数组同样适用。去掉最后一项后面的逗号。
无效
[
"red",
"green",
]
有效
[
"red",
"green"
]
2. 用单引号代替双引号
JavaScript 常常接受单引号。JSON 不接受。属性名和字符串值都必须用双引号。
无效
{
'name': 'Alex'
}
有效
{
"name": "Alex"
}
3. 未加引号的属性名
在 JavaScript 里有时可以不带引号写 name。在 JSON 里,每个属性名都必须是双引号字符串。
无效
{
name: "Alex",
age: 30
}
有效
{
"name": "Alex",
"age": 30
}
4. 值之间漏掉逗号
属性和数组项之间需要逗号。解析器可能在下一个引号或括号上报 Unexpected token,而不是在缺逗号的位置。
无效
{
"name": "Alex"
"age": 30
}
有效
{
"name": "Alex",
"age": 30
}
5. 括号或多或少
对象用 { },数组用 [ ]。嵌套 JSON 常在缺 ]、多 },或两者对调时失败。数清开闭配对。
无效
{
"items": [1, 2
}
有效
{
"items": [1, 2]
}
6. 非法转义序列
JSON 字符串里,反斜杠开始转义。"、\、\n 这类序列是合法的。把 Windows 路径写成 C:\Users 则不行:\U 不是合法的 JSON 转义。把反斜杠写成两道,否则解析器会停在那个字符上。
无效
{"file":"C:\Users\Alex"}
有效
{"file":"C:\\Users\\Alex"}
7. JSON 里的注释
标准 JSON 没有注释。有些配置工具接受 // 或 /* */(JSONC、JSON5 等)。那不是标准 JSON,JSON.parse 会拒绝。
无效
{
// user name
"name": "Alex"
}
Unexpected token 是什么意思?
解析器在该位置遇到了不允许的字符。标出的位置是读取停止处。如果前面漏了逗号,错误可能指到下一个属性的引号。措辞因运行时而异;不要指望每个浏览器打印同一句话。
Unexpected end of JSON input 是什么意思?
文本在值写完之前就结束了。常见原因包括缺 } 或 ]、输入被截断、空正文,或中途断开的 API 响应。不是单一一种故障。
JSON.parse() 为什么会失败?
JSON.parse() 只接受有效的 JSON 文本。下面会成功:
const text = '{"name":"Alex"}';
const data = JSON.parse(text);
下面会失败,因为单引号不是 JSON:
const text = "{'name':'Alex'}";
JSON.parse(text);
确切的错误文案取决于 JavaScript 运行时。把消息当线索,然后检查该位置附近的逗号、引号和括号。
JavaScript 对象字面量可以写成 { name: 'Alex' }。有效 JSON 必须写成 { "name": "Alex" }:双引号的名称和字符串,没有尾随逗号,没有注释。
- JSON 文本
- 解析器读取记号
- 有效数据,或 Unexpected token
如何快速找到 JSON 错误
按这个顺序做。不要一上来就整文件重写。
- 把 JSON 交给校验器。
- 阅读第一条报告的错误。
- 看报告位置稍前一点。
- 检查逗号,尤其是尾随和缺失的。
- 检查引号:只能用双引号。
- 配对 { } 和 [ ]。
- 检查字符串里的反斜杠转义。
- 若需要严格 JSON,去掉注释。
常见修法速查:
| 问题 | 修法 |
|---|---|
| 尾随逗号 | 删掉最后一项后面的逗号。 |
| 单引号 | 名称和字符串改用双引号。 |
| 未加引号的键 | 把属性名包在双引号里。 |
| 漏掉的逗号 | 在属性或数组项之间加上逗号。 |
| 缺少的括号 | 闭合每一对 { } 和 [ ]。 |
| 非法转义 | 使用合法转义,或把路径里的反斜杠写成两道。 |
| 注释 | 要标准 JSON 就去掉 // 和 /* */。 |
在浏览器里校验并格式化 JSON
NEXNARA JSON 格式化、校验与对比 可以在这台设备上检查 JSON。
可以校验,用 2 空格、4 空格或制表符美化,minify,比较两份文档(JSON Diff),并打开 .json 文件。解析用浏览器里的 JSON.parse,不用 eval。
大于 5 MB 的文档可能变慢。大于 15 MB 的文本不会在浏览器里处理,以便页面保持响应。
JSON 处理本身在你的浏览器里完成。此工具不会把文本发到 NEXNARA 服务器。广告和其他站点功能仍会用网络;那与处理无关。
需要检查无效 JSON?打开 JSON 格式化、校验与对比 并粘贴文本。
FAQ
为什么我的 JSON 提示 Unexpected token?
解析器在该处遇到了不允许的字符。真正的错误——常常是漏逗号或单引号——可能就在该位置之前。
JSON 允许尾随逗号吗?
不允许。标准 JSON 不允许最后一个属性或数组项后面有逗号。JavaScript 对象字面量常常允许。
JSON 能用单引号吗?
不能。属性名和字符串必须用双引号。
JSON 能包含注释吗?
标准 JSON 不行。有些工具接受带注释的 JSONC 或 JSON5;JSON.parse 仍会拒绝。
JSON.parse() 为什么失败?
字符串不是有效 JSON。常见原因是尾随逗号、单引号、未加引号的键、注释,或被截断的值。确切消息取决于运行时。
怎样检查 JSON 是否有效?
把它贴进 JSON 格式化、校验与对比 这类校验器,或在控制台调用 JSON.parse。若解析抛错,文本就不是有效 JSON。