JSON.parse报“Unexpected token”错误是因为其严格遵循JSON规范,只接受双引号、无尾逗号、无注释/undefined/函数等标准格式,遇非法字符立即抛错,不作容错修复,需通过trim()、try-catch及服务端校验来防护。

因为 JSON.parse 只认标准 JSON 格式,而单引号和尾随逗号都不在 JSON 规范里。
JSON 是一种独立的数据交换格式,不是 JavaScript 语法
很多人误以为 JSON 就是“JS 对象字面量的字符串版”,其实不是。JSON(JavaScript Object Notation)是一套严格定义的、语言无关的文本数据格式,由 RFC 7159 和 ECMA-404 标准规定。它只允许:
- 键名和字符串值必须用双引号包裹(
"name"✅,'name'❌,name❌) - 不允许尾随逗号(
{"a":1,"b":2,}❌,必须写成{"a":1,"b":2}✅) - 不支持注释、undefined、NaN、Infinity、函数、Symbol、BigInt 等 JS 特有值
- 所有控制字符(如换行、制表符)必须正确转义(
"\n"✅,"\n"直接写在字符串中未转义 ❌)
JSON.parse 不做容错,只做严格校验
它不是“尽力解析”,而是“全或无”:只要发现一个不符合规范的地方,就立刻抛出 SyntaxError: Unexpected token,不会跳过、修复或猜测意图。这是设计使然——保证数据交换的确定性和安全性。例如:
-
JSON.parse("{'name': 'Alice'}")→ 报错:单引号不是合法引号 -
JSON.parse('{"id": 1,}')→ 报错:末尾逗号违反语法 -
JSON.parse('{"at": 2023-01-01}')→ 实际被当作数学表达式计算,解析为{"at": 2022}(因为2023-01-01被 JS 当作减法运算)
为什么不能自动修复?风险远大于便利
看似加个替换就能解决单引号问题,但真实场景更复杂:
立即学习“Java免费学习笔记(深入)”;
- 字符串值里本身含单引号(
{"msg": "It's OK"}),盲目全局替换成双引号会破坏语义 - 嵌套结构中混用引号、括号不匹配、缺失大括号等,简单正则无法安全识别
- 使用
eval或Function解析非标字符串存在严重 XSS 和代码执行风险,绝对不推荐 - 后端本应返回标准 JSON;容忍脏数据会掩盖接口质量问题,让错误层层下推
实际开发中怎么应对
不靠“修复”,而靠“防护 + 预处理 + 明确责任”:
- 前端 fetch 后先检查
response.ok和Content-Type: application/json - 对响应体做
trim()去除 BOM 或首尾空白,再传给JSON.parse - 用
try...catch包裹,捕获SyntaxError并记录原始字符串用于排查 - 第三方或老旧系统返回非标数据时,明确要求对方修正;若不可控,用专用库(如
json5或lossless-json)替代,而非手写脆弱正则


















