JSON.parse()是唯一安全的JSON解析方式,须传入合法字符串并用try/catch捕获SyntaxError;reviver函数可用于字段转换但不可修改结构;需预处理BOM、HTML错误页等非法内容;JSON.stringify()不支持循环引用和undefined,需手动处理。

JSON.parse() 是唯一安全可靠的解析方式,别用 eval() 或 new Function() —— 那不是“捷径”,是执行任意代码的后门。
JSON.parse() 怎么用?参数和错误处理必须写全
只传字符串进去会崩,遇到非法 JSON(比如尾部多逗号、单引号、undefined)直接抛 SyntaxError。生产环境必须包 try/catch:
try {
const data = JSON.parse(jsonString);
} catch (e) {
console.error('JSON 解析失败:', e.message);
// 可选:返回默认值或上报错误
}
-
JSON.parse()第二个参数是 reviver 函数,可用于过滤或转换字段,比如把时间字符串转成 Date 对象 - 不要在 reviver 里修改原始对象结构(如 delete 某个 key),容易引发不可预测行为
- 如果后端返回的是 JSONP 或带前缀的响应(如
callback({...})),先用正则或字符串截取剥离外壳,再 parse
什么时候不能直接用 JSON.parse()?常见绕过场景
以下情况 JSON.parse() 会直接报错,得先清洗:
- 后端返回了 HTML 错误页(如 500 页面)混在响应体里 —— 先检查
response.headers.get('content-type')是否含application/json - 字符串含 BOM(
\uFEFF)或不可见控制字符 —— 用jsonString.trim().replace(/^\uFEFF/, '')预处理 - 使用了 JavaScript 特有字面量(
undefined、NaN、函数、正则)—— 这根本不是合法 JSON,需后端修正
JSON.stringify() 的坑:循环引用、日期、undefined 怎么办
JSON.stringify() 遇到循环引用直接报 TypeError: Converting circular structure to JSON,且会静默丢弃 undefined、函数、Symbol 类型字段:
本文档主要讲述的是使用JSON进行网络数据交换传输;JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,非常适合于服务器与客户端的交互。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON的数据格式非常简单,您可以用 JSON 传输一个简单的 St
立即学习“Java免费学习笔记(深入)”;
- 日期对象默认转成 ISO 字符串(
"2024-06-15T10:30:00.000Z"),如需自定义格式,先调.toISOString()或.toLocaleString()再赋值 - 要保留
undefined?不行 —— JSON 标准不支持,只能提前替换为null或占位字符串 - 解决循环引用:用
structuredClone()(现代浏览器)浅拷一份再 stringify;或手动实现 replacer 函数标记已遍历对象
真正麻烦的从来不是语法,而是前后端对“什么是合法 JSON”的理解偏差 —— 比如空数组 [] 和空对象 {} 在业务逻辑里含义可能完全不同,但 parse 出来都是“空”。这类语义层问题,光靠 JSON 方法解决不了。










