什么是 JSON Parse Error?
JSON Parse Error 是 JavaScript 在尝试解析 JSON 字符串时发生的错误。当你的代码试图用 JSON.parse() 把一个字符串转成 JavaScript 对象,但字符串的格式不符合 JSON 规范时,就会抛出这个错误。
// 触发 JSON Parse Error 的典型情况
const jsonStr = '{"name": "Clover", age: 16}';
// age 没有加引号,不是合法的 JSON
JSON.parse(jsonStr);
// SyntaxError: Unexpected token 'a', ... is not valid JSON
const badJson = '{"greeting": "hello"}'; // 末尾多了不可见字符
JSON.parse(badJson); // 可能报错:Unexpected end of JSON input
最常见的 5 种触发原因
1. 键或字符串值没加引号
JSON 标准要求所有键和字符串值必须用双引号包裹。单引号、不加引号都会报错。
// ❌ 错误示例
{"name": "Clover"} // 正确
{name: "Clover"} // 错误:键没引号
{'name': "Clover"} // 错误:单引号不行
// ✅ 正确示例
{"name": "Clover"}
2. 尾部多余逗号
JavaScript 对象可以写尾部逗号,但 JSON 不允许。
// ❌ 错误
{"name": "Clover",}
// ✅ 正确
{"name": "Clover"}
3. 单引号或反引号作为字符串边界
// ❌ 错误
const data = JSON.parse("{'name': 'Clover'}");
// JavaScript字符串可以用单引号,但解析时JSON只认双引号
// ✅ 正确
const data = JSON.parse('{"name": "Clover"}');
4. 数字格式错误
JSON 数字不能有前导零(01),不能是非数字(NaN、Infinity)。
// ❌ 错误
{"count": 007} // 前导零
{"ratio": .5} // 必须写 0.5
{"bad": NaN} // JSON 里没有 NaN
// ✅ 正确
{"count": 7}
{"ratio": 0.5}
{"bad": null} // 用 null 表示无值
5. BOM 头或隐藏字符
从文件或某些接口返回的 JSON 前面可能有 UTF-8 BOM(\uFEFF),肉眼看不见,但会导致解析失败。
const raw = '\uFEFF{"ok": true}';
JSON.parse(raw); // SyntaxError: Unexpected token ''
// ✅ 解决:去掉 BOM
const clean = raw.replace(/^\uFEFF/, '');
JSON.parse(clean); // OK
如何快速定位 JSON 错误?
手动找 JSON 里的格式问题很痛苦,最快的方法是用在线工具校验。
- 打开 JSON 格式化工具,粘贴你的 JSON,工具会告诉你哪一行哪一列出错
- 用 JSON 校验工具,直接高亮错误位置
// 手动调试:在 JSON.parse 外面包 try-catch
try {
const data = JSON.parse(responseText);
} catch (e) {
console.error('JSON解析失败:', e.message);
console.log('原始内容:', responseText);
// 找到报错位置后,通常附近就是问题所在
}
// 进阶:用 reviver 函数获取具体路径
JSON.parse(text, (key, value) => {
console.log('解析到:', key, value);
return value;
});
后端返回的 JSON 报错了怎么办?
很多时候 JSON Parse Error 不是你的代码问题,而是后端返回的数据格式不对。
第一步:打印原始响应
fetch('/api/data')
.then(r => r.text()) // 先不用 .json(),拿到原始文本
.then(text => {
console.log('原始响应:', text);
// 检查:是否有意外的 HTML 包裹?是否有异常字符?
return JSON.parse(text);
})
.catch(e => console.error(e));
第二步:检查 Content-Type
// 如果后端返回的是 text/html(错误页),解析 JSON 当然失败
// 响应头里应该是:
Content-Type: application/json; charset=utf-8
// 如果是:
Content-Type: text/html; charset=utf-8
// 说明后端报错了,返回的是 HTML 错误页面,不是 JSON
第三步:后端返回脏数据
有时后端数据库里存了特殊字符,或者序列化时出了问题,导致输出的 JSON 不规范。
// Node.js 调试:打印中间变量
const serialized = JSON.stringify(dataFromDB);
console.log(serialized); // 看看是不是有乱码或多余字符
安全地解析 JSON(防止崩溃)
// 方法一:try-catch 包裹
function safeJsonParse(str, fallback = null) {
try {
return JSON.parse(str);
} catch (e) {
console.warn('JSON解析失败:', e.message);
return fallback;
}
}
// 方法二:先校验再解析(推荐性能敏感场景)
function isValidJson(str) {
try {
JSON.parse(str);
return true;
} catch { return false; }
}
// 方法三:使用 reviver 深度检查(生产环境推荐)
const data = JSON.parse(text, (key, value) => {
if (typeof value === 'string' && value.includes('\u0000')) {
throw new Error(`Null character in key: ${key}`);
}
return value;
});
常见错误对照表
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
| Unexpected token | 格式错误(引号/逗号/括号不匹配) | 用工具格式化并定位错误位置 |
| Unexpected end of JSON input | 字符串被截断,或多了特殊字符 | 检查是否有 BOM 头或多余字符 |
| Expected ',' or '}' | 对象或数组里少了逗号/括号 | 逐行检查格式 |
| Expected property name or '}' | 键没有用双引号 | 所有键必须用双引号 |
工具推荐
- JSON 格式化工具 — 一键美化,错误位置高亮
- JSON 校验工具 — 严格校验,发现不合规字段
- JSON ↔ YAML 互转 — 如果你搞混了格式
常见问题
Q: 遇到 json-parse-error什么意思,是什么原因导致的?
A: 常见原因有:数据格式不符合规范(如 JSON 多了逗号或少了引号)、字符编码不统一(UTF-8 和 GBK 混用)、特殊字符未正确转义,或接口返回了非标准数据。先用工具验证格式是最快的排查方式。
A: 常见原因有:数据格式不符合规范(如 JSON 多了逗号或少了引号)、字符编码不统一(UTF-8 和 GBK 混用)、特殊字符未正确转义,或接口返回了非标准数据。先用工具验证格式是最快的排查方式。
Q: json-parse-error什么意思 会影响程序正常运行吗?
A: 会的。格式错误会导致数据无法正常解析,轻则功能异常,重则程序崩溃。尤其是涉及支付、用户输入等关键流程时,这类问题必须第一时间修复。
A: 会的。格式错误会导致数据无法正常解析,轻则功能异常,重则程序崩溃。尤其是涉及支付、用户输入等关键流程时,这类问题必须第一时间修复。
Q: json-parse-error什么意思 有没有自动修复的办法?
A: 大多数格式问题可以用在线工具自动修复。如果是自己生成的 JSON/编码数据,修复后再重新提交即可;如果是第三方接口返回的格式问题,则需要联系对方修正或做容错处理。
A: 大多数格式问题可以用在线工具自动修复。如果是自己生成的 JSON/编码数据,修复后再重新提交即可;如果是第三方接口返回的格式问题,则需要联系对方修正或做容错处理。
Q: 修复后还需要注意什么?
A: 建议增加格式校验环节,在数据提交前或接收后先做格式验证(用 JSON.parse 或对应工具),避免再次出现同样问题。同时统一前后端编码规范,从源头减少这类错误。
A: 建议增加格式校验环节,在数据提交前或接收后先做格式验证(用 JSON.parse 或对应工具),避免再次出现同样问题。同时统一前后端编码规范,从源头减少这类错误。