这个指南解决什么问题?
本页用于排查 JSON 格式化、校验、类型和复制复核问题,帮助你把接口响应、日志片段或配置文件转换成可读、可检查、可安全复制的结构。
什么时候应该停下来复核?
当输入来自生产日志、接口响应、客户数据、密钥片段或待发布配置时,应先脱敏并保留原始样本,再比较工具输出是否只改变预期格式。
首页 / 指南中心 / JSON.stringify 与 JSON.parse 数据丢失排查
JSON.stringify 与 JSON.parse 数据丢失排查
说明 stringify/parse 往返中 undefined、函数、Date、大整数、NaN、Infinity 和循环引用的常见数据丢失。
先用 JSON 工具观察序列化后的文本,再确认字段是否被丢弃或改写。
这个页面解决什么问题
很多开发者把 JSON.stringify 和 JSON.parse 当成“深拷贝”或“保存任意对象”的通用方法,但 JavaScript 对象并不都能无损变成 JSON。undefined、函数、Symbol、Date、NaN、Infinity、Map、Set、循环引用和大整数都可能丢失、变成 null、变成字符串或直接报错。
这个页面适合排查本地缓存、接口 mock、日志落盘、前端状态复制和调试工具输出不一致的问题。重点是确认序列化后的 JSON 是否还能表达原始对象的业务含义。
快速判断
- 对象属性值是
undefined时,stringify 后该属性可能消失。 - 数组里的
undefined、NaN或Infinity可能变成null。 - Date 对象会变成 ISO 字符串,parse 回来后不再是 Date 实例。
- 包含循环引用时,stringify 会失败而不是自动处理。
可复制示例:错误输入与修复后输入
下面样例展示了原始对象和可持久化 JSON 的差异。修复不是让 JSON 支持所有类型,而是显式转换业务需要的值。
const source = { count: NaN, save: undefined, createdAt: new Date(), run(){}, items:[undefined, 1] };
JSON.stringify(source);{"count":null,"createdAt":"2026-06-01T09:00:00.000Z","items":[null,1],"note":"non-json values removed before export"}修复后的 JSON 明确承认不可表示的值已经被处理,并用 note 记录转换决策。对于业务关键字段,应在序列化前手动映射,而不是依赖默认行为。
诊断步骤
- 列出对象里所有非 JSON 类型:函数、undefined、Date、Map、Set、BigInt、Symbol。
- 先对小对象执行 stringify,查看字段是否消失或变成 null。
- 把结果粘贴到 JSON 工具 中格式化,逐项对照原对象。
- 需要 Date 时记录为 ISO 字符串,并在读取端显式转回 Date。
- 需要大整数时优先用字符串保存,避免 JavaScript number 精度限制。
- 禁止用 JSON 往返替代严肃的深拷贝或数据迁移方案。
JSON 是数据交换格式,不是 JavaScript 对象快照。凡是无法被 JSON 直接表达的类型,都应该有显式转换规则和测试样例。
常见错误表
| 现象或场景 | 常见原因 | 处理动作 |
|---|---|---|
| 属性消失 | 值为 undefined、函数或 Symbol。 | 序列化前转换为 null、字符串或删除并记录原因。 |
| 数组项变成 null | 数组中有 undefined、NaN 或 Infinity。 | 确认目标系统是否接受 null,必要时过滤。 |
| 时间变成字符串 | Date 自动转成 ISO 字符串。 | 读取端显式解析,并保留时区语义。 |
| stringify 抛出循环引用错误 | 对象互相引用。 | 改用专门序列化方案或手动抽取无循环数据。 |
常见误判
- 把 JSON stringify/parse 当成深拷贝工具,用在复杂状态对象上。
- 把 Date 字符串读回来后继续当 Date 调用方法。
- 忽视 NaN 和 Infinity 在 JSON 中没有原生表示。
- 把大整数订单号当 number 处理,导致精度已经在序列化前丢失。
排查数据丢失时,要把“序列化前对象”和“序列化后 JSON 文本”并排保存。只看 parse 后结果,很难判断是写入时丢失还是读取时解释错误。
隐私、安全和适用边界
用于排查时请使用脱敏样本。不要粘贴访问令牌、Cookie、客户资料、内部域名、未公开商业规则、支付记录或完整生产日志。页面适合处理公开示例、教学片段、复现样本和已经替换真实值的配置。
本页仅讨论 JSON 与 JavaScript 常见行为。其他语言的序列化库可能有自定义规则,正式数据迁移应以项目 schema、测试和版本兼容策略为准。
复制或发布前复核清单
- 是否列出所有非 JSON 类型字段。
- 是否确认 undefined、函数和 Symbol 没有被静默丢弃。
- Date 是否保存了明确时区。
- 大整数是否用字符串表示。
- 是否保留原始对象和序列化文本的对比记录。
- 是否在目标读取端验证 parse 后类型。
相关工具和延伸阅读
参考依据
- MDN JSON.stringify():不可序列化值、toJSON 与 replacer 行为。
- MDN JSON.parse():reviver 与解析结果。
- MDN Date:时间对象与 ISO 字符串。
参考资料和规范来源
本页的排查建议结合浏览器行为、公开标准和常见开发实践整理。涉及线上发布、安全决策或兼容性判断时,请以官方规范和你自己的运行环境为准。
编辑记录:Ymir Tool editorial review,2026-06-01。本页作为 Sprint 3 新增案例/排错内容发布,目标是把单一工具入口扩展为可复核的任务说明、错误示例和操作边界。
编辑与复核说明
本页由 Ymir Tool editorial review 维护,最后更新于 2026-06-01。页面示例使用合成输入,避免展示真实密钥、客户资料或生产日志。复制结果到正式流程前,请结合对应工具页、官方规范和你自己的运行环境再次确认。