在 JavaScript 里用 JSON.parse() 解析字符串时,经常会抛 SyntaxError。报错信息里往往藏着一个 position 数字,看懂它就能快速定位。本文汇总最常见的几种报错及修复方法。
含义:JSON 字符串在「还没结束」时就戛然而止了。
常见原因:少写了一个闭合的括号或花括号,或者字符串被意外截断。
JSON.parse('{"name":"Tom"') // ❌ 少了一个 }
JSON.parse('{"name":"Tom"}') // ✅ 正确
修复:检查花括号 {} 和方括号 [] 是否一一配对。
含义:多了一个右括号或右花括号。
JSON.parse('{"name":"Tom"}}') // ❌ 多了一个 }
JSON.parse('{"name":"Tom"}') // ✅ 正确
修复:检查是不是有多余的闭合符号。
含义:逗号出现在不该出现的位置,通常是尾逗号。
JSON.parse('{"a":1,}') // ❌ 尾逗号
JSON.parse('{"a":1}') // ✅ 正确
修复:删除最后一个元素后面的逗号。
含义:字符串位置出错,常见原因是单引号或引号不匹配。
JSON.parse("{'name':'Tom'}") // ❌ 单引号
JSON.parse('{"name":"Tom"}') // ✅ 正确
修复:所有字符串改用双引号,并检查引号是否成对。
含义:出现了 undefined、NaN 等 JSON 不支持的裸值。
JSON.parse('{"n": NaN}') // ❌ NaN
JSON.parse('{"n": null}') // ✅ 用 null 代替
修复:把 undefined、NaN、Infinity 转成 null 或字符串。
报错里的 position 82 表示第 82 个字符(从 0 开始),不是行号。要换算成行号列号,可以用 JSON 在线校验工具 粘贴后自动定位,它会直接告诉你「第几行第几列」,比手动数快得多。
JSON.parse 报错时,用 console.log 把字符串前 50 个和后 50 个字符打出来,往往一眼就能看出引号、括号哪里不匹配:
try {
JSON.parse(str);
} catch (e) {
console.log(str.slice(0, 50));
console.log(str.slice(-50));
}