JSON 极客开发实用工具箱
v2.5 Pro格式化解析、树状图、TS / Go / Python / Rust / Java 高级代码生成、语义差异对比与 YAML/XML 互转。
阿里云爆款云服务器 · 开发者上云特惠 99元/年起
2核2G/2核4G 高性能轻量服务器、OSS 对象存储与云数据库限时特价,专属通道直达优惠。
等待输入格式化...常用数据序列化格式对比:JSON vs JSON5 vs YAML vs XML
语法严谨度、注释支持、数据开销与各工程场景选型建议。
| 格式规范 | 键名引号要求 | 尾随逗号与注释 | 数据载荷开销 | 最佳应用场景 |
|---|---|---|---|---|
| 标准 JSON | 必须双引号 "" | 不支持尾逗号,严禁任何注释 | 极低 (轻量高效) | Web RESTful API 数据交互、微服务 RPC 通信 |
| JSON5 | 支持无引号或单引号 | 支持尾随逗号、单行 // 与多行 /* */ 注释 | 低 | tsconfig.json、Babel/ESLint 等前端工程配置 |
| YAML | 绝大多数情况免引号 | 基于严格缩进,支持 # 行注释与锚点引用 | 极低 (可读性最强) | Kubernetes (k8s) 编排、Docker Compose、CI/CD 流程 |
| XML | 成对标签包裹 | 支持 <!-- --> 注释与属性语法 | 较高 (闭合标签冗余) | SOAP WebService、Java Maven pom.xml、Android 布局 |
JSON 核心技术与避坑问答 (FAQ)
大整数精度丢失原理、循环引用报错排查及 Unicode 转义规则。
Q1: 为什么 JavaScript 在解析大整数(如 64 位雪花 ID 或订单号)时末尾数字会变 0?
JavaScript 的 Number 类型遵循 IEEE 754 双精度浮点数标准,其能安全精确表达的最大整数为 Number.MAX_SAFE_INTEGER,即 \( 2^{53} - 1 = 9007199254740991 \)(约 16 位数字)。而像分布式雪花算法(Snowflake ID)生成的通常是 18~19 位的 64 位整数,直接使用浏览器原生 JSON.parse() 解析时,超出精度的低位二进制将被强制截断舍入为 0。最佳解决方案:后端在 JSON 序列化时将该字段转为 String 字符串输出;或前端在传输层引入 json-bigint 库进行无损解析。
Q2: 出现 "TypeError: Converting circular structure to JSON" 该如何排查?
当某个对象的属性直接或间接引用了该对象自身(例如 node.parent = parent; parent.child = node;)时,调用 JSON.stringify() 会引发无限递归死循环,引擎便会主动抛出该循环引用异常。解决方法:在序列化前剥离回环引用,或在 JSON.stringify(obj, replacer) 中传入自定义 replacer 函数,使用 WeakSet 记录已遍历过的对象引用并跳过重复项。
Q3: 为什么有时 JSON 中的中文会变成形如 \u4f60\u597d 的 Unicode 转义符?
\uXXXX 是 Unicode 字符在 ASCII 编码环境下的转义表示法(4 位十六进制数对应 UTF-16 码元)。许多早期的后端序列化库(如 Python json.dumps(ensure_ascii=True) 或老版本 PHP)为了保证生成的 JSON 文本在不支持 UTF-8 的网络信道中不会乱码,默认会将所有非 ASCII 字符转义为 \uXXXX。现代网络已全量普及 UTF-8 编码,通常只需设置对应参数(如 Python ensure_ascii=False)即可直接输出正常的中文字符。