JSON.parse 报错原因汇总

在 JavaScript 里用 JSON.parse() 解析字符串时,经常会抛 SyntaxError。报错信息里往往藏着一个 position 数字,看懂它就能快速定位。本文汇总最常见的几种报错及修复方法。

Unexpected end of JSON input

含义:JSON 字符串在「还没结束」时就戛然而止了。

常见原因:少写了一个闭合的括号或花括号,或者字符串被意外截断。

JSON.parse('{"name":"Tom"')        // ❌ 少了一个 }
JSON.parse('{"name":"Tom"}')       // ✅ 正确

修复:检查花括号 {} 和方括号 [] 是否一一配对。

Unexpected token } / ]

含义:多了一个右括号或右花括号。

JSON.parse('{"name":"Tom"}}')      // ❌ 多了一个 }
JSON.parse('{"name":"Tom"}')       // ✅ 正确

修复:检查是不是有多余的闭合符号。

Unexpected token ,

含义:逗号出现在不该出现的位置,通常是尾逗号。

JSON.parse('{"a":1,}')             // ❌ 尾逗号
JSON.parse('{"a":1}')              // ✅ 正确

修复:删除最后一个元素后面的逗号。

Unexpected string / Unexpected token ’

含义:字符串位置出错,常见原因是单引号或引号不匹配。

JSON.parse("{'name':'Tom'}")       // ❌ 单引号
JSON.parse('{"name":"Tom"}')       // ✅ 正确

修复:所有字符串改用双引号,并检查引号是否成对。

Unexpected token u / n

含义:出现了 undefined、NaN 等 JSON 不支持的裸值。

JSON.parse('{"n": NaN}')           // ❌ NaN
JSON.parse('{"n": null}')          // ✅ 用 null 代替

修复:把 undefined、NaN、Infinity 转成 null 或字符串。

position 数字是什么意思

报错里的 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));
}

延伸阅读