必须先清洗、再校验、后解析,并隔离执行环境:预处理剔除bom/html/空白,用try...catch仅捕获syntaxerror,解析后还需校验结构与类型,内联json须用application/json script标签配合textcontent获取。

不能直接用 JSON.parse() 硬解析,必须先清洗、再校验、后解析,并始终隔离执行环境。核心是:不信任任何输入,把“解析成功”和“数据可用”分开处理。
预处理字符串:剔除干扰内容
外部返回的响应体可能根本不是 JSON,比如网关错误页、HTML 模板、BOM 字符或空响应。需在解析前做基础清理:
- 用
.trim()去掉首尾空白,避免空格导致SyntaxError - 用
.replace(/^\uFEFF/, '')清除 UTF-8 BOM(常见于某些服务端生成的 JSON) - 检查开头是否含
/code>、<code>、<code><script> 等 HTML 特征,发现即拒绝解析</script> - 确认字符串非空:
if (!str || !str.trim()) return null
严格解析 + 异常捕获
JSON.parse() 是唯一可接受的方式,eval、new Function 或拼接字符串执行都属于高危操作,必须禁用:
- 必须用
try...catch包裹,且只静默处理SyntaxError;其他异常(如内存溢出)不应掩盖 - 不要假设
response.json()安全——它不校验 HTTP 状态码,404/500 响应仍会进.then()并尝试解析 - 推荐组合:
await response.text()→ 预处理 →JSON.parse(),绕过Content-Type误判问题
解析后结构校验:防“合法但不可用”
解析成功 ≠ 数据符合业务预期。字段缺失、类型错乱、嵌套断裂都会引发后续崩溃:
- 检查返回值是否为对象或数组:
parsed && typeof parsed === 'object',排除"hello"或42这类标量 - 对关键字段做类型断言,例如
typeof data?.id === 'number'或Array.isArray(data?.items) - 用可选链(
?.)和空值合并(??)访问嵌套属性,避免Cannot read property 'xxx' of undefined - 必要时引入轻量 schema 校验(如
zod或手动守卫函数),尤其在低代码、规则引擎等动态场景
特殊场景:内联 JSON 的安全嵌入
若服务端将 JSON 直接写入页面(如 SSR 场景),应避免 <script>var data = {...}</script> 这类可执行形式:
- 使用
<script type="application/json" id="page-data">{...}</script>,浏览器不会执行其中内容 -
前端用
document.getElementById('page-data').textContent获取(不用innerHTML) - 获取后仍需走前述清洗 → 解析 → 校验全流程
- 后端框架(如 Django
json_script、Next.jsJSON.stringify预渲染)可减少手写风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











