javascript json数据如何处理_序列化与反序列化有哪些方法【教程】

8次阅读

javaScript中jsON序列化与反序列化仅靠json.stringify()和JSON.parse(),undefined/function/symbol被忽略,循环引用报错,日期转ISO字符串但无法还原;解析失败主因是语法不合法,需try/catch防护;特殊类型须手动转换,JSON非对象持久化方案。

javascript json数据如何处理_序列化与反序列化有哪些方法【教程】

javascript 中 JSON 数据的序列化与反序列化,核心就靠 JSON.stringify()JSON.parse(),没有其他“标准方法”——所有所谓“高级用法”都是在这两个函数的参数和使用方式上做文章。

为什么 JSON.stringify() 有时不按预期输出?

常见现象:对象里有 undefinedfunctionSymbol 或循环引用,结果字段消失或直接报错。

  • undefinedfunction 在对象属性中会被静默忽略(不是报错);在数组中变成 NULL
  • 遇到循环引用(比如 a.b = a),会抛出 TypeError: Converting circular structure to JSON
  • 日期对象被转成 ISO 字符串,但 date 实例本身无法被还原(JSON.parse() 只返回字符串)
  • 如果需要定制行为,传入第二个参数 replacer(函数或数组):例如 JSON.stringify(obj, (k, v) => typeof v === 'number' ? v.toFixed(2) : v)

JSON.parse() 解析失败的典型原因

错误信息通常是 SyntaxError: Unexpected Token ...,本质是输入不是合法 JSON 字符串。

  • 单引号代替双引号({'a':1} ❌,必须是 {"a":1} ✅)
  • 尾随逗号({"a":1,} ❌)
  • 键名没加引号({a:1} ❌)
  • 包含注释({"a":1} // comment ❌)
  • 传入了 nullundefined 或非字符串值(会先被转成字符串再解析,多数情况出人意料)
  • 安全起见,建议包裹 try/catch,尤其处理用户输入或网络响应时

如何安全地序列化/反序列化带特殊类型的对象?

原生 JSON API 不支持 DateregexpmapSet 等,需手动转换。

立即学习Java免费学习笔记(深入)”;

  • 序列化前:把 Date 转成时间戳或 ISO 字符串;Map/Set 转成数组;RegExp 提取 .source.flags
  • 反序列化后:用 reviver 参数(JSON.parse(str, reviver))识别特定格式字段并重建类型,例如检测到 __date__ 字段就 new Date(value)
  • 不要依赖第三方库“自动修复”,容易掩盖数据结构问题;明确知道哪些字段要特殊处理,比全局劫持更可控

真正容易被忽略的点是:JSON 是数据交换格式,不是 JavaScript 对象持久化方案。它不保留原型链、不可枚举属性、getter/setter 或任何运行时行为。如果你需要深拷贝或状态保存,JSON.stringify+JSON.parse 只适用于纯数据对象——一旦出现函数、类实例或复杂嵌套引用,就得换思路。

text=ZqhQzanResources