信息发布→ 登录 注册 退出

javascript如何操作json_怎样序列化和解析复杂数据结构

发布时间:2025-12-27

点击量:
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 字符串(如 "2025-05-12T08:30:00.000Z"),但解析后是字符串而非 Date 实例。若需还原为 Date,可借助 reviver 函数:

  • 序列化时无需特殊操作(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
  • 用第三方库如 flattedcycle.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 验证
标签:# javascript  # java  # js  # json  # ai  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!