你的 JSON 在骗你:序列化往返中的数据与类型失真
来源:blog.gaborkoos.com — 2026-08-03
📋 概述
文章揭示 JavaScript 中最常见的序列化往返(JSON.stringify + JSON.parse)会在数据不报错的情况下悄悄改变数字、丢失属性、抹平类型。作者逐一剖析大整数精度损失、undefined 的多重含义、对象顺序的脆弱、Date/Map/Set 等类型被抹除、序列化会执行代码、以及循环引用无法跨越边界等陷阱,并主张在跨系统边界前显式定义 wire 表示,让便捷编码不至于悄悄变成意外的数据契约。
🔑 核心要点
- JSON 无法精确承载超过 2^53-1 的整数,9007199254740993 序列化后变成 …992
- JSON 没有 undefined,对象里的 undefined 属性会被静默省略,与 null 的“清空”语义混淆
- RFC 8259 把对象定义为无序集合,依赖顺序的跨语言解析不可靠,需要顺序就用数组表达
- Date 被转成 ISO 字符串、Map/Set/RegExp/Error 变成空对象、NaN/Infinity 变成 null,原始类型信息全部丢失
- toJSON/getter/replacer 会在序列化时执行代码,把序列化当成可执行行为来对待
- 解决方案:为每个非 JSON 类型显式定义序列化形式,大整数用十进制字符串承载
💡 金句
JSON 可以始终保持合法,而含义却在传输途中悄悄改变——把 JSON 边界显式化,便捷编码就不会不经意变成意外的数据契约。
👍 0
👎 0
← 返回 Lobsters 首页