Tool House

YAML 与 JSON 的 7 个关键区别

分类:开发技巧 作者:admin 更新:2026-10-03T13:54:32

两者都能表达同样的数据结构,但 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,这是转换前就已经发生的损失。

← 返回知识库 回到首页