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

JavaScript 中 JSON 数据的序列化与反序列化,核心就靠 JSON.stringify() 和 JSON.parse(),没有其他“标准方法”——所有所谓“高级用法”都是在这两个函数的参数和使用方式上做文章。
为什么 JSON.stringify() 有时不按预期输出?
常见现象:对象里有 undefined、function、Symbol 或循环引用,结果字段消失或直接报错。
-
undefined和function在对象属性中会被静默忽略(不是报错);在数组中变成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❌) - 传入了
null、undefined或非字符串值(会先被转成字符串再解析,多数情况出人意料) - 安全起见,建议包裹
try/catch,尤其处理用户输入或网络响应时
如何安全地序列化/反序列化带特殊类型的对象?
原生 JSON API 不支持 Date、RegExp、Map、Set 等,需手动转换。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“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 只适用于纯数据对象——一旦出现函数、类实例或复杂嵌套引用,就得换思路。










