JavaScript中安全处理JSON需用try...catch包裹JSON.parse()并利用reviver转换日期,JSON.stringify()会忽略undefined/函数/Symbol且不支持循环引用,须手动处理ISO日期、过滤循环引用及编码问题。

JavaScript 中解析和操作 JSON 数据主要靠 JSON.parse() 和 JSON.stringify(),但实际使用中容易踩坑——比如日期变字符串、函数丢失、循环引用报错、特殊字符处理异常等。
如何安全解析 JSON 字符串
用 JSON.parse() 解析字符串时,必须确保输入是合法 JSON 格式(双引号键名、无尾逗号、无注释、无 undefined 或函数)。非法格式会直接抛出 SyntaxError。
- 始终用 try...catch 包裹解析逻辑,避免崩溃
- 可传入第二个参数 reviver 函数 在解析过程中转换值,例如把 ISO 字符串转为 Date 对象
-
浏览器环境可配合
response.json()(fetch API)自动解析,但后端返回非 JSON 内容时仍需错误处理
如何正确序列化 JS 对象为 JSON
JSON.stringify() 会忽略 undefined、函数、Symbol 类型的属性,且不能处理循环引用对象(会报 TypeError: Converting circular structure to JSON)。
- 若需保留日期,先手动转成 ISO 字符串:
obj.date = obj.date.toISOString() - 处理循环引用:可用自定义 replacer 过滤掉引用字段,或借助库如
flatted或cycle - 需要缩进美化输出时,第三个参数支持数字(空格数)或字符串(如
" ")
常见 JSON 序列化/解析问题汇总
以下问题高频出现,且容易被忽视:
立即学习“Java免费学习笔记(深入)”;
-
时间对象变成空对象:
JSON.stringify(new Date())返回"2023-01-01T00:00:00.000Z"是对的,但JSON.parse()不会自动还原为 Date,得靠 reviver 手动转换 -
NaN、Infinity 转为 null:JSON 规范不支持这些值,序列化后变成
null,解析后无法区分原始值 -
中文或特殊字符乱码:通常因响应头缺少
Content-Type: application/json; charset=utf-8,或文件保存编码不是 UTF-8 -
前后端字段命名不一致:JS 常用 camelCase,后端常用 snake_case,需在解析后映射或用库如
camelize/decamelize
实用建议:提升健壮性的小技巧
不必每次都手写容错逻辑,可以封装轻量工具函数:
- 写一个
safeParse(jsonStr, defaultValue = null),内部 try/catch 并返回默认值 - 用
JSON.stringify(obj, (key, val) => typeof val === 'bigint' ? val.toString() : val)支持 BigInt(ES2020+) - 调试时用
console.log(JSON.stringify(obj, null, 2))查看结构,比直接打印更清晰











