5月29日 01:08

JavaScript 中如何解析和序列化 JSON?有哪些高级用法?

JavaScript 通过 JSON.parse() 将 JSON 字符串转为 JS 值,通过 JSON.stringify() 将 JS 值转为 JSON 字符串。基本用法直观,但有几个关键细节:JSON.parse() 第二个参数 reviver 可在解析时转换值(如把日期字符串还原为 Date 对象);JSON.stringify() 第二个参数 replacer 可过滤或转换属性,第三个参数 space 控制缩进格式化输出。序列化时 undefined 和函数在对象中会被忽略、在数组中变为 null,Date 转为 ISO 字符串,RegExp 变为空对象,Symbol 键被丢弃。循环引用会抛出 TypeError。JSON.parse('123') 合法——JSON 的最外层不一定是对象。

追问

  • JSON.stringify() 遇到循环引用怎么办?如何实现一个安全的序列化函数?
  • replacer 传数组 vs 传函数有什么区别?各自的典型使用场景是什么?
  • JSON.stringify(NaN)JSON.stringify(Infinity) 的结果是什么?为什么?
  • BigInt 为什么不能被 JSON.stringify 序列化?有哪些变通方案?
  • reviver 函数的执行顺序是怎样的?嵌套对象是从内到外还是从外到内?

写段代码

javascript
// replacer 过滤敏感字段 const user = { name: 'Alice', token: 'secret', age: 25 }; const safe = JSON.stringify(user, (k, v) => k === 'token' ? undefined : v ); // {"name":"Alice","age":25} // reviver 还原日期 const s = '{"date":"2025-01-01"}'; const obj = JSON.parse(s, (k, v) => k === 'date' ? new Date(v) : v ); // obj.date instanceof Date === true
标签:JSON