json.parse 不自动保障安全,必须配合 try/catch 捕获异常、预校验输入合法性、解析后验证结构与类型,并警惕原型污染风险。

JSON.parse 本身不自动处理安全性问题,它只负责解析符合 JSON 格式的字符串。所谓“安全转换”,核心是避免解析恶意或非法输入导致的异常或意外行为,关键在于提前校验 + 捕获错误 + 限制结构。
确保输入是合法 JSON 字符串
JSON.parse 对非标准格式(如单引号、尾逗号、undefined、注释、函数)会直接抛出 SyntaxError。不能依赖它来“容错解析”。
- 用正则粗筛(仅作快速预判,不替代 try/catch):例如
/^\s*[\{\[].*[\}\]]\s*$/s.test(str)可排除明显非对象/数组开头的字符串 - 更可靠的方式是始终配合 try/catch —— 这不是可选项,而是必须步骤
必须用 try/catch 捕获解析异常
任何来自用户输入、网络响应、localStorage 的字符串,都应视为不可信。不加保护地调用 JSON.parse 可能导致脚本中断。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 基础写法:
let obj;<br>try {<br> obj = JSON.parse(inputString);<br>} catch (e) {<br> console.warn('JSON 解析失败:', e.message);<br> obj = null; // 或返回默认空对象 {}<br>} - 避免在 catch 中吞掉错误却不处理 —— 至少记录日志或提供 fallback 值
必要时校验解析后对象的结构和类型
即使字符串成功解析,也不能保证结果是你期望的形状。比如后端返回 "null" 字符串,JSON.parse 会得到真正的 null;或返回一个数组而非对象。
- 检查类型:
obj !== null && typeof obj === 'object' && !Array.isArray(obj) - 检查关键字段:
obj && typeof obj.id === 'string' && typeof obj.name === 'string' - 可用工具库如 AJV 做 schema 验证,适合复杂场景
警惕原型污染与特殊 key(高级风险)
标准 JSON 不包含 __proto__、constructor 等属性,但某些非标准解析器或手动拼接的“类 JSON”字符串可能引入。虽然原生 JSON.parse 会忽略这些(它们在 JSON 中非法),但仍需注意:
- 不要用
JSON.parse解析不受控的、可能被篡改的 JSON-like 字符串(比如从 URL 参数拼出来的) - 如果必须处理含特殊 key 的数据,解析后手动过滤掉危险属性:
delete obj.__proto__; delete obj.constructor; - 现代环境可结合
Object.freeze()或Object.create(null)创建无原型的对象做进一步防护
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










