json.parse() 报 unexpected token 错误,主因是输入非合法 json 字符串,如含单引号、尾随逗号、undefined、注释等;需先校验字符串类型与格式,再 try/catch 安全解析。

直接说结论:JSON.parse() 遇到 Unexpected token 错误,90% 是因为输入不是合法 JSON 字符串——比如多了逗号、用了单引号、包含 undefined 或注释。
为什么 JSON.parse() 会报 Unexpected token
JSON 格式比 JavaScript 对象字面量严格得多:不能有尾随逗号、不能用单引号、不能有 undefined / NaN / 函数 / 注释 / 多余空格(某些位置)。
- 常见错误现象:
JSON.parse("{a: 1}")→SyntaxError: Unexpected token a in JSON at position 1(key 必须双引号) - 常见错误现象:
JSON.parse('{"name": "Alice",}')→Unexpected token }(尾随逗号不被允许) - 使用场景:后端返回的响应体被误当成 JSON 处理,但实际是 HTML 错误页或未格式化的 JS 对象字符串
- 检查方法:先用
typeof data === 'string'和data.trim().startsWith('{')粗筛;再用try/catch包裹解析,捕获具体出错位置
怎么安全地解析不确定格式的字符串
别硬刚,加一层容错逻辑。尤其在处理用户输入、第三方 API 响应或 localStorage 数据时。
- 先判断是否为字符串:
if (typeof input !== 'string') return null - 用正则粗略过滤明显非法内容:
input = input.replace(/[\r\n\t]/g, '')(换行和制表符在 JSON 中虽合法,但常是人工拼接痕迹) - 尝试解析并捕获错误:
try { return JSON.parse(input); } catch (e) { console.warn('Invalid JSON:', e.message, 'input:', input.slice(0, 50)); return null; } - 不要用
eval()或Function()替代——哪怕看起来“能跑”,也等于主动打开 XSS 和执行任意代码的大门
JSON.stringify() 输出后又被 JSON.parse() 报错?
说明原始数据里藏了 JSON 不支持的值,比如 Date、RegExp、undefined、循环引用对象——stringify 会静默忽略或转成 null,但有时你没意识到它已经“失真”了。
- 典型问题:
JSON.stringify({ time: new Date() })→{"time":"2024-06-12T08:30:00.000Z"}(看似正常),但如果你依赖Date实例方法,还原后就只剩字符串 - 循环引用会直接抛
TypeError: Converting circular structure to JSON,必须提前检测或用自定义 replacer 处理 - 解决办法:用
JSON.stringify(obj, (key, value) => value instanceof Date ? value.toISOString() : value)统一序列化时间 - 更稳妥的做法:用
structuredClone()(现代浏览器)替代“先 stringify 再 parse”这种模拟深拷贝的土办法
真正麻烦的不是语法错误本身,而是错误发生在异步链路深处,比如 fetch 回调里解析响应体失败,却没做任何错误处理,最后只看到一个 undefined 在下游炸开——这时候连日志都难定位源头。










