JSON 与 YAML:数据交换的王者为何是 JSON?{#sec-7a866b84f44c}
“YAML 明明更易于人类阅读,为何 API 通信却几乎都使用 JSON?” “YAML 的优势体现在何处?JSON 又因何成为标准?”

1. 数据格式之战的序幕{#sec-9e7c7d30e051}
过去,开发者们需要一种“通用规范”来在系统之间交换数据。起初,XML 占据了这一地位。
<person>
<name>Alice</name>
<age>25</age>
<skills>
<skill>Python</skill>
<skill>Django</skill>
</skills>
</person>
然而,XML 需要逐一关闭标签,这使其过于冗长和笨重,阅读起来也相当费力。此时,JSON 和 YAML 应运而生,成为替代方案。
2. JSON:成为 Web 数据交换的标准{#sec-80d11bb3f8ce}
2001 年,道格拉斯·克罗克福德从 JavaScript 的对象表示法中获得灵感,创建了 JSON。其核心理念是“尽可能轻量,便于机器读取”。
JSON 成功的秘诀显而易见: * 极致轻量: 只传递数据,无多余修饰。 * 与 Web 完美契合: 浏览器(JavaScript)无需额外库即可直接将其转换为对象。 * 直观映射: 其结构与 Python 的 Dict、JS 的 Object 等现代语言的数据结构几乎完全一致。
特别是随着 REST API 成为 Web 的主流,JSON 实际上已成为全球通用语言。
3. YAML:为人类阅读而生的格式{#sec-d6bd20dac978}
也有一些阵营,比起 JSON,更专注于“人类阅读的乐趣”。YAML 便是在“能否在没有大括号或引号的情况下写得更简洁?”的思考中诞生的。
name: Alice
age: 25
skills:
- Python
- Django
YAML 的特点非常鲜明: * 极高的可读性: 基于缩进,文本非常整洁。 * 支持注释(#): 能够添加 JSON 不具备的“说明”,是一大优势。 * 配置文件的强者: 得益于其可读性,它完全主导了 Kubernetes、Docker、GitHub Actions 等基础设施的配置格式。
但为何在数据交换(API)领域,它未能超越 JSON 呢?
4. YAML 在数据交换中落后的现实原因{#sec-9d0abeae52f7}
首先,缩进的严格性(空格 vs Tab) JSON 通过括号来确定结构,而 YAML 则由一个不可见的空格来决定结构。在交换复杂数据时,一个错误的空格就可能导致调试噩梦。
其次,解析速度和资源消耗 JSON 语法简单,解析器非常轻巧快速。相比之下,YAML 语法庞大且复杂(甚至包含代码执行功能),解析它需要消耗更多的内存和 CPU。这在大量数据交换的 API 环境中是致命的。
第三,安全问题 YAML 不仅仅是简单的数据格式,它还可以包含直接调用特定语言对象的功能。这可能导致远程代码执行(RCE)等安全漏洞,因此不适用于与不特定多数进行数据交换的 API。
5. 最终是“适得其所”的问题{#sec-82859d40c1f9}
如果说 JSON 是数据交换的王者,那么 YAML 则作为配置文件的王者,各自巩固了其领域。
- 何时使用 JSON: Web API 通信、NoSQL 数据库存储、客户端与数据传输时。
- 何时使用 YAML: 项目配置文件(
docker-compose.yml)、CI/CD 脚本、需要人工管理的文档。
即使在 Django Rest Framework(DRF) 中可以添加 YAMLRenderer,但默认值始终是 JSONRenderer。因为数据必须准确且快速。
结论:一句话总结{#sec-bbef8539dcff}
“机器之间的对话(API)交给 JSON,人机对话(配置)交给 YAML。”
推荐阅读:
目前没有评论。