安全解析json需先清理(bom、空白、html页)、再try/catch区分syntaxerror与其他异常、解析后校验结构,并配合fetch时先检查response.ok或用safeparsejson替代response.json()。

直接用 JSON.parse() 解析后端返回的 JSON 字符串,看似简单,但实际中极易出错——不是数据格式不合法,就是结构意外变化,或是隐藏的 BOM、空白、错误页混入响应体。安全解析的核心不是“能不能转”,而是“有没有兜底、是否可预期、失败时是否可控”。
先清理再解析:处理常见污染源
后端响应文本常含不可见字符或非 JSON 内容,比如 UTF-8 BOM(\uFEFF)、HTML 错误页、日志前缀、首尾空格等。这些不会报错,但会导致 JSON.parse() 直接失败。
- 用
.replace(/^\uFEFF/, '').trim()清除 BOM 和首尾空白 - 若响应可能被代理/网关注入 HTML(如 502 页面),建议加简单校验:开头是否为
{或[,避免静默解析失败页 - 不推荐自动去除字符串内部非法字符(如单引号、注释)——那是后端责任,前端强行修复会掩盖真实问题
用 try/catch 封装,但别只捕获 SyntaxError
JSON.parse() 只在语法错误时抛 SyntaxError,但其他异常(如内存溢出、超长递归)也可能发生。安全封装需区分处理:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 对
SyntaxError返回null或默认值,便于业务层判断缺失 - 对其他异常应重新抛出,不静默吞掉——可能是环境或数据量级问题,需要告警而非忽略
- 避免 fallback 到空对象(
{}),否则字段访问data.user.name不报错却得undefined,掩盖结构变更
解析后校验结构,不止看是不是 object
成功解析 ≠ 数据可用。后端可能返回 "success" 字符串、42 数字,或结构与文档不符的对象。建议在解析后做轻量校验:
- 检查类型:
parsed && typeof parsed === 'object' && parsed !== null - 按业务需要验证关键字段是否存在,例如
parsed.data && Array.isArray(parsed.items) - 用可选链(
?.)和空值合并(??)访问嵌套属性,避免运行时崩溃
配合 fetch 使用时,别依赖 response.json()
response.json() 内部调用 JSON.parse(),但它不检查 HTTP 状态码——404、500 响应仍会进 .then() 并尝试解析,大概率失败。
- 正确做法:先判断
response.ok,再调用response.json() - 更稳做法:用
safeParseJSON(await response.text())替代response.json(),完全掌控解析过程 - 如果接口约定非 2xx 也返回 JSON(如带 error 字段的统一响应),那就必须用
response.text()+ 自定义解析
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










