## JSON 与 YAML:数据交换的王者为何是 JSON?{#sec-7a866b84f44c} > “YAML 明明更易于人类阅读,为何 API 通信却几乎都使用 JSON?” > “YAML 的优势体现在何处?JSON 又因何成为标准?” ![JSON 与 YAML 中世纪之战](/media/whitedec/blog_img/JSON_vs_YAML_Medieval_Battle.webp) --- ## 1. 数据格式之战的序幕{#sec-9e7c7d30e051} 过去,开发者们需要一种“通用规范”来在系统之间交换数据。起初,**XML** 占据了这一地位。 ```xml Alice 25 Python Django ``` 然而,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 便是在“能否在没有大括号或引号的情况下写得更简洁?”的思考中诞生的。 ```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。”** **推荐阅读:** - [[Python 标准库 - 2] 数据存储与序列化:json, pickle, csv](/ko/whitedec/2026/1/30/python-json-pickle-csv/)