JSON.parse() 抛出 SyntaxError 主因有三:传入非字符串类型(如 null、对象)、字符串含 JS 风格语法(单引号、尾逗号等)、存在 BOM 或控制字符;须先校验类型与格式,再清理隐藏字符并 try/catch 解析。

JSON.parse() 会抛出 SyntaxError?先检查这三处
绝大多数 JSON.parse() 报错不是因为“数据真坏了”,而是字符串本身没被正确传入——它只认标准 JSON 格式字符串,不接受 undefined、null、对象字面量或带单引号的伪 JSON。
传入的不是字符串,而是其他类型
常见错误:直接把后端返回的已解析对象、或者 localStorage.getItem('data') 返回的 null 丢给 JSON.parse()。
- ✅ 正确做法:始终用
typeof data === 'string'和data.trim() !== ''做前置校验 - ⚠️ 特别注意:
fetch的response.json()已经解析过了,再套一层JSON.parse()必报错 - ❌ 错误示例:
JSON.parse({ name: "Alice" })(这是对象,不是字符串);JSON.parse(null)(会转成字符串"null",但解析失败)
字符串里混了 JS 风格语法
比如单引号、尾逗号、注释、undefined 字面量——这些在 JS 对象字面量里合法,但 JSON 不认。
- ✅ 解决方案:用正则粗筛(仅作快速判断):
/^[\s{[}/.test(str)确保开头是{或[;再用try/catch包裹解析 - ⚠️ 常见陷阱:后端用
JSON.stringify()没问题,但前端拼接字符串时用了单引号:'{"name": "Bob"}'是合法字符串,但"{'name': 'Bob'}"就非法 - ❌ 错误示例:
JSON.parse("{'name': 'Tom'}")→SyntaxError: Unexpected token '
响应体含 BOM 或不可见控制字符
尤其多见于 PHP、Python 后端未设置 UTF-8 without BOM,或日志中意外写入 \u0000、\u200b 等零宽字符。
- ✅ 实操建议:解析前先清理头部 BOM:
str.replace(/^\uFEFF/, '');再用str.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g, '')剔除控制字符(按需启用) - ⚠️ 兼容性注意:IE11 对某些 Unicode 控制符解析更敏感,即使 Chrome 不报错,也可能导致字段丢失
- ❌ 错误现象:控制台看不出异常,但
JSON.parse(str)报Unexpected token(后面空着,没具体字符),大概率是开头有隐藏字符
真正难调试的从来不是语法错误,而是你以为它是个字符串,其实它前面悄悄贴了个 \uFEFF,或者后端返回了 204 状态但你仍去 parse 空响应体。

















