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 对象默认序列化为 ISO 字符串(如 "2025-05-12T08:30:00.000Z"),但解析后是字符串而非 Date 实例。若需还原为 Date,可借助 reviver 函数:
JSON.stringify(new Date()) 正常输出字符串)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 支持带引用标记的序列化/反序
列化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); }typeof data === 'object' && data !== null)或配合 zod/yup 做 schema 验证