浏览器安全处理json的核心是防御性使用json.parse()和json.stringify():必须用try/catch包裹parse,预清洗空格/bom并校验字符串类型;stringify会静默丢弃undefined/函数/symbol,date转iso,循环引用直接报错;fetch应调用res.json()而非手动parse;定制转换须用replacer/reviver。

浏览器里安全处理 JSON,核心就两条:用 JSON.parse() 解析字符串,用 JSON.stringify() 序列化对象——但直接调用容易出错,关键在防御性写法和理解边界。
解析 JSON 字符串必须加 try/catch
任何来自外部的字符串(fetch 响应、localStorage、用户输入)都可能非法,JSON.parse() 遇错直接抛 SyntaxError,不捕获就会中断执行。
- 永远别省略
try { ... } catch (e) { ... },哪怕只是 console.error - 先
trim()再解析:空格、换行、BOM(\uFEFF)都会导致失败 - 确保输入是字符串:
typeof str === 'string',避免传入null、undefined或已解析的对象 - 不要用
eval()或构造函数替代,它们不校验语法且有执行风险
序列化对象要清楚哪些值会被丢
JSON.stringify() 不是“原样转字符串”,它有一套静默过滤规则:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
-
undefined、函数、Symbol属性:整个键值对消失({a: 1, b: undefined}→"{"a":1}") -
Date自动转 ISO 字符串;NaN、Infinity变null -
RegExp变空对象{};Map、Set、BigInt原生不支持 - 循环引用直接抛
TypeError,无法靠 try/catch 挺过去
网络请求中别手动 parse 响应体
fetch 返回的是 Response 对象,不是字符串。直接 JSON.parse(await fetch(...)) 必然报错。
- 正确做法:
const res = await fetch(url); if (res.ok) { const data = await res.json(); } -
res.json()内部已调用JSON.parse()并做了基础容错,但仍需检查res.ok - 如果后端返回非标准 JSON(如单引号、尾逗号),应推动服务端修复,前端不宜用
replace()硬改
需要定制转换时用 replacer 和 reviver
这两个参数是唯一安全、标准的扩展点,比正则或手动遍历更可靠:
- 序列化时用
replacer函数:比如把Date转时间戳val instanceof Date ? val.getTime() : val - 解析时用
reviver函数:比如把"2026-09-04"自动转成Date实例 - 传数组可白名单字段:
JSON.stringify(obj, ['id', 'title']),轻量又明确 - 注意
reviver中顶层 key 是空字符串,需判断避免误操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










