
三种格式,一个目的
XML、JSON 和 YAML 都表示同一件事:作为文本的结构化数据。它们都可以表达对象(键值对)、数组、字符串、数字、布尔值和空值。区别在于语法、冗长程度以及每种格式设计要解决的问题。
知道何时使用哪一种可以节省时间,并避免那种多年后才会显现问题的架构决策。
XML:冗长的老将
XML(可扩展标记语言)于 1998 年标准化。它使用类似 HTML 的开闭标签:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>Alice</name>
<age>30</age>
<active>true</active>
<roles>
<role>admin</role>
<role>editor</role>
</roles>
</person>
XML 的优势:
- 元素上的属性(元数据与内容分离)
- 命名空间(对大型企业系统至关重要)
- 注释在文档中得以保留
- 通过 XSD 或 DTD 进行模式验证
- 直接对数据进行 XSLT 转换
- 签名和加密(XML DSig、XMLENC)
XML 的不足:
- 冗长:闭标签使行数翻倍
- 在大多数用例中,属性和子元素没有区别
- 解析速度较慢,库也更重
- 数组需要按惯例使用包装元素(没有原生数组类型)
JSON:网络标准
JSON(JavaScript 对象表示法)在 RFC 7159(现为 RFC 8259)中正式化,大约在 2010 年成为 REST API 的默认数据交换格式。其语法直接映射到 JavaScript 对象和数组:
{
"name": "Alice",
"age": 30,
"active": true,
"roles": ["admin", "editor"]
}
JSON 的优势:
- 原生数组——无需包装器的一等类型
- 与 JavaScript(以及所有现代语言)紧密集成
- 紧凑且解析快速
- 字符串、数字和布尔值之间有清晰区分
- 普遍支持——每个 API 客户端、数据库和语言都能处理
JSON 的不足:
- 没有注释——无法在 JSON 文件中添加注解
- 严格的语法——尾随逗号、单引号和未加引号的键都会导致解析错误
- 不支持二进制数据(必须使用 Base64)
- 没有内置的模式强制(需要单独的 JSON Schema)
- 对于包含许多相似重复值的配置文件来说过于冗长
YAML:人类友好的配置格式
YAML(YAML 不是标记语言)被设计为对人类最易读的数据格式。它使用缩进而不是括号:
name: Alice
age: 30
active: true
roles:
- admin
- editor
YAML 的优势:
- 简单字符串不需要括号、花括号或引号
- 使用
#添加注释 - 多行字符串自然
- 非常适合开发人员每天阅读和编辑的配置文件
- 支持引用和锚点以避免重复(DRY 配置)
- 广泛用于 CI/CD(GitHub Actions、GitLab CI、CircleCI)
YAML 的不足:
- 缩进敏感:一个空格错误就会破坏文件
- 类型推断可能让你意外(挪威问题:
NO在旧解析器中解析为布尔值false) - 不适合 API 响应——解析太慢且过于模糊
- 锚点和别名使大文件难以理解
直接比较
| 属性 | XML | JSON | YAML |
|---|---|---|---|
| 首次出现 | 1998 | 2001 | 2001 |
| 主要用途 | 企业数据、SOAP、文档 | REST API、数据存储 | 配置文件 |
| 注释 | 是 | 否 | 是 |
| 原生数组 | 否(通过惯例) | 是 | 是 |
| 模式验证 | XSD、DTD | JSON Schema | 无官方标准 |
| 二进制数据 | Base64 | Base64 | Base64 |
| 人类可读性 | 低 | 中 | 高 |
| 解析速度 | 慢 | 快 | 中 |
| 冗长程度 | 高 | 中 | 低 |
| 缩进敏感 | 否 | 否 | 是 |
何时使用每种格式
选择 XML 当:
- 与企业系统集成(SAP、Salesforce、SOAP API)
- 需要类似文档的特性:混合内容、命名空间、元素属性
- 行业强制要求(医疗 HL7、金融 FIX、出版 DocBook)
- 需要 XML 签名或加密
选择 JSON 当:
- 构建或消费 REST API
- 在 MongoDB 或 PostgreSQL(JSONB)等数据库中存储文档数据
- 在浏览器和服务器之间发送数据
- 需要最大的语言和工具兼容性
选择 YAML 当:
- 为应用程序、CI/CD 管道或基础设施即代码编写配置文件
- 使用 Kubernetes、Helm、Ansible 或 Docker Compose(均为 YAML 原生)
- 文件将经常由人类阅读和编辑
- 想要内联注释来记录决策
转换示例
三种格式中的相同数据:
<server>
<host>db.example.com</host>
<port>5432</port>
<ssl>true</ssl>
</server>
{
"server": {
"host": "db.example.com",
"port": 5432,
"ssl": true
}
}
server:
host: db.example.com
port: 5432
ssl: true
注意,对于相同的数据,YAML 是 5 行,而 JSON 是 7 行,XML 是 8 行。在规模上,这种差异在存储和可读性方面都会累积。
处理所有三种格式的工具
| 任务 | 工具 |
|---|---|
| 将 JSON 转换为 YAML | JSON 转 YAML 转换器 |
| 将 XML 转换为 JSON | XML 转 JSON 转换器 |
| 格式化和验证 JSON | JSON 格式化器 |
| 格式化和验证 XML | XML 格式化器 |
| 查看和探索 YAML | YAML 查看器 |
→ 使用 JSON 转 YAML 转换器 在格式之间即时切换,无需手动重写。