JavaScript操作JSON核心是JSON.stringify()和JSON.parse(),前者序列化对象为字符串,后者解析字符串为对象;对Date需reviver还原,循环引用需replacer规避或用第三方库,Map/Set等需手动转换,解析须try/catch容错。

JavaScript 操作 JSON 的核心就是 JSON.stringify() 和 JSON.parse() 两个方法,它们分别负责序列化(对象 → 字符串)和解析(字符串 → 对象)。对复杂数据结构(如含函数、Date、undefined、循环引用、Map/Set、RegExp 等),原生 JSON 方法有局限,需额外处理。
基础序列化与解析
绝大多数普通对象、数组、字符串、数字、布尔值、null 都能直接用原生方法处理:
-
序列化:
JSON.stringify({ name: "Alice", age: 30 })→'{"name":"Alice","age":30}' -
解析:
JSON.parse('{"name":"Alice","age":30}')→{ name: "Alice", age: 30 }
注意:JSON 标准不支持 undefined、函数、Symbol、BigInt;这些在 stringify 时会被忽略(对象属性)或转为 null(数组元素)。
处理日期(Date)和自定义格式
Date 对象默认序列化为 ISO 字符串(如 "2024-05-12T08:30:00.000Z"),但解析后是字符串而非 Date 实例。若需还原为 Date,可借助 reviver 函数:
立即学习“Java免费学习笔记(深入)”;
- 序列化时无需特殊操作(
JSON.stringify(new Date())正常输出字符串) - 解析时用 reviver 判断并重建:
JSON.parse(jsonStr, (key, val) => {
if (typeof val === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(val)) {
return new Date(val);
}
return val;
});
应对循环引用和不可序列化类型
遇到循环引用(如 obj.a = obj)会直接报错 TypeError: Converting circular structure to JSON。解决方案包括:
- 使用
JSON.stringify(obj, (key, val) => { ... })自定义 replacer,跳过循环引用字段(例如记录已访问对象 Set,重复出现则返回undefined) - 用第三方库如
flatted或cycle.js支持带引用标记的序列化/反序列化 - 对 Map/Set/RegExp 等,需手动转换为普通对象或数组再序列化,例如:
const map = new Map([['a', 1]]);
const plainObj = Object.fromEntries(map); // { a: 1 }
安全解析与容错处理
用户输入或网络响应的 JSON 字符串可能格式错误。务必用 try/catch 包裹 JSON.parse:
try { const data = JSON.parse(str); } catch (e) { console.error('Invalid JSON:', e.message); }- 不要信任任何外部来源的 JSON 字符串——它可能被恶意构造(虽 JSON 本身不执行代码,但后续处理逻辑可能受控)
- 如需更严格的校验,可在解析后用类型检查(如
typeof data === 'object' && data !== null)或配合 zod/yup 做 schema 验证











