YAML 与 JSON 的 7 个关键区别
两者都能表达同样的数据结构,但 YAML 的缩进规则、隐式类型转换和注释支持带来了一堆反直觉的坑。搞清楚这些差异,才知道什么时候该用哪个。
配置文件用 YAML,接口通信用 JSON——这是常见约定,但背后的原因值得说清楚。
一、可读性:YAML 胜在小巧
server:
port: 8080
hosts:
- a.example.com
- b.example.com
同一份数据用 JSON:
{ "server": { "port": 8080, "hosts": ["a.example.com", "b.example.com"] } }
YAML 用缩进代替括号,省掉大量引号和逗号,人读起来更接近自然层级。
二、YAML 的缩进是语法,不是风格
JSON 里多缩进一个空格无所谓;YAML 里缩进错一格就是另一个数据结构,甚至直接解析失败。而且 YAML 不允许用 Tab 缩进。
三、YAML 支持注释
JSON 标准不支持注释。实践中有人写 // 或 _comment 字段,前者会让严格解析器报错,后者会污染真实数据。
YAML 的 # 注释是语言特性,这是它成为配置文件首选的重要原因。
四、隐式类型转换是最大陷阱
YAML 会自动把无引号的值推断成类型,于是出现这些著名意外:
version: 1.10→ 被解析成数字 1.1(末尾 0 丢失)country: NO→ 被解析成布尔值false(挪威的国家代码是 NO)port: 080→ 八进制,等于十进制的 64
凡是版本号、国家代码、以 0 开头的编号,一律加引号。
五、JSON 有严格的官方标准
JSON 由 RFC 8259 定义,语法极小、歧义极少。YAML 规范庞大(YAML 1.1 曾有大量歧义),不同语言的实现存在细节差异。跨系统交换数据时,JSON 的确定性更让人放心。
六、JSON 解析性能更好
JSON 的语法简单,解析器可以做到极高效率;YAML 需要处理缩进、隐式类型、锚点引用等,解析明显更慢。对高频接口来说,这个差距是实打实的。
七、YAML 有锚点与引用
defaults: &defaults
timeout: 30
retries: 3
serviceA:
<<: *defaults
url: https://a.example.com
& 定义锚点、* 引用、<< 合并,能消除配置重复。JSON 没有对应机制。
该用哪个
- 接口传输、日志、缓存:JSON。标准严格、解析快、各语言支持一致。
- 人工维护的配置:YAML。注释和缩进让 diff 更可读(Kubernetes、CI 配置都选它)。
- 两者互转:用 YAML / JSON 互转工具。转的时候留意上文的隐式类型问题——YAML 转 JSON 后
version: 1.10会变成1.1,这是转换前就已经发生的损失。