JSON 看起来简单得迷人——只有字符串、数字、布尔值、null、对象和数组。然而经验丰富的开发者仍会被一些规范允许但无人预料的微妙行为坑到。以下是最常见的 10 个 JSON 陷阱,以及确切的修复方法。
1. 浮点数精度丢失
JSON.parse("0.1") 返回一个 JavaScript 数字,而 IEEE 754 浮点运算中 0.1 + 0.2 等于 0.30000000000000004。当你把金融数据或科学测量值序列化为 JSON 时,精度会悄然丢失。
修复:以整数存储金额(分,而非元),科学数据使用全精度字符串序列化:JSON.stringify({ value: num.toPrecision(15) })。
2. 大整数精度丢失
JavaScript 的 Number 是 64 位浮点,有 53 位尾数。大于 2^53 - 1(9,007,199,254,740,991)的整数无法精确表示。Twitter API 曾因此同时以数字和字符串两种格式返回推文 ID。
修复:使用现代 JavaScript 的 BigInt,或将大整数序列化为字符串并在 API 文档中注明。使用 JSON 格式化器 直观检查 Payload 中的大数。
3. 尾后逗号
{ "name": "Alice", } 在 JavaScript 对象字面量中合法,但在 JSON 中非法,严格解析器会报错。开发者常将 JS 代码中的对象字面量直接粘贴进 JSON 配置文件,就会踩到这个坑。
修复:使用 Linter(ESLint 的 jsonc 插件)或将 JSON 粘贴进我们的 JSON 格式化与验证器,即刻捕获尾后逗号。
4. JSON 中的注释
JSON 不支持注释。// 注释 或 /* 块注释 */ 都不合法。这让来自 JavaScript 或 Python 的开发者颇为意外。
修复:如需带注释的配置文件,改用 JSONC、YAML 或 TOML。
5. undefined 和函数被静默丢弃
JSON.stringify({ a: 1, b: undefined, c: () => {} }) 返回 {"a":1},b 和 c 都被静默省略。当你期望某个键存在时,这会导致难以调试的问题。
修复:序列化前审查对象,将表示"显式缺席"的 undefined 替换为 null,并使用 JSON.stringify 的自定义 replacer 捕获意外类型。
6. Date 对象变成字符串
JSON.stringify(new Date()) 产生 "2026-03-22T08:00:00.000Z",JSON.parse 回来只得到字符串,而非 Date 对象。这种不对称性在比较时间戳时会导致 Bug。
修复:使用自定义 reviver;或统一对所有日期字段使用 Unix 时间戳(整数)。使用时间戳转换器在格式间切换。
7. 循环引用让 JSON.stringify 崩溃
若对象直接或间接引用自身,JSON.stringify 会抛出 TypeError: Converting circular structure to JSON。DOM 节点、Express 请求对象或复杂图结构常触发此问题。
修复:使用 flatted 或 circular-json 库,或实现自定义 replacer,用 WeakSet 追踪已见对象。
8. 重复的对象键
JSON 规范允许重复键({ "a": 1, "a": 2 }),但未定义哪个优先。不同解析器行为各异:多数保留最后一个,少数保留第一个,有些直接抛错。
修复:将重复键视为 Bug。使用我们的 JSON 差异工具 比较两份 Payload。
9. Unicode 转义混淆
JSON 要求字符串为合法 UTF-8,但你可能遇到 \uXXXX 转义序列。"\u0041" 和 "A" 语义相同,但混用会导致令人困惑的 diff 和难以阅读的调试输出。
修复:统一使用字面量 UTF-8 字符,使用我们的 Unicode 转换器 解码 JSON Payload 中的 \uXXXX 序列。
10. Content-Type 请求头错误
通过 HTTP 发送 JSON 时,必须设置 Content-Type: application/json。遗漏或使用 text/plain 会导致许多框架和 API 网关将 Body 视为原始文本,跳过自动解析。
修复:始终设置正确的 Content-Type,并使用Content-Type 参考表查询任意格式对应的 MIME 类型。
JSON 简单到一个下午就能学会,却深刻到足以在生产环境坑你多年。收藏本清单并分享给你的团队吧。需要快速检查、格式化或验证 JSON Payload 时,daima.life 的 JSON 格式化器 全部搞定——纯客户端,零数据传输,即时响应。