JSON解析难点在于数据结构不一致、字段缺失、类型错乱及网络异常;SyntaxError多因后端返回HTML/JSONP/BOM等非标准JSON;res.json()不校验HTTP状态码,需手动判断res.ok;取嵌套字段应使用可选链或兜底逻辑;前后端字段命名差异需解析后映射。

JSON 解析本身很简单,JSON.parse() 就能搞定;真正卡住人的,是 API 返回数据结构不一致、字段缺失、类型错乱,或者没处理好网络异常和空响应。
遇到 SyntaxError: Unexpected token 怎么办
这几乎全是 JSON.parse() 报的错,说明传进去的不是合法 JSON 字符串。常见原因:
- 后端返回了 HTML(比如 500 错误页、登录跳转页),而不是 JSON —— 先用
response.text()打印原始响应体看一眼 - 响应头没设
Content-Type: application/json,但浏览器不会因此拒绝解析,只是容易误判编码;真正影响的是你手动读取时用了错误方式 - 字符串里混入了 BOM(尤其是 Windows 记事本保存的 JSON 文件),可用
str.replace(/^\uFEFF/, '')清除 - 后端返回了 JSONP 格式(如
callback({...})),这不是标准 JSON,不能直接parse
fetch().then(res => res.json()) 为什么有时还是报错
res.json() 是个异步方法,它只负责解析响应体,但不检查 HTTP 状态码。404、500、甚至 204 响应都可能触发它,而 204 没有响应体,会直接 reject。
- 必须在
.json()前加状态判断:if (!res.ok) throw new Error(res.status) - 空响应(如
204 No Content)会导致res.json()报Unexpected end of JSON input,此时应改用res.text()并手动判断是否为空字符串 - 某些接口返回
text/plain但内容其实是 JSON,res.json()会因 MIME 类型不匹配失败,此时改用res.text().then(JSON.parse)
解析后怎么安全取嵌套字段(比如 data.user.profile.name)
别直接链式访问,一碰 undefined 就崩。现代 JS 推荐用可选链操作符,但要注意兼容性:
立即学习“Java免费学习笔记(深入)”;
- 支持环境(ES2020+):直接写
data?.user?.profile?.name,中间任意一层为null或undefined都返回undefined - 需兼容旧环境:用逻辑运算符兜底,如
((data || {}).user || {}).profile || {},或封装一个安全取值函数 - 更稳妥的做法是结合 TypeScript 类型守卫,或用
zod/yup做运行时校验,避免靠经验猜字段是否存在
最常被忽略的一点:后端字段命名风格(snake_case)和前端(camelCase)不一致,光靠解析解决不了——得在解析后做一次字段映射,否则后续所有调用都得写 user['first_name'] 这种反直觉写法。











