"YAML易于人类阅读,为什么数据交换的王座却属于JSON?"
"YAML强在哪里,JSON又为什么必胜?"


🔥 1. 数据格式战争的序幕

很久以前,程序员们需要一种存储和交换数据的方法
在早期,XML占据了王座。

<person>
    <name>Alice</name>
    <age>25</age>
    <skills>
        <skill>Python</skill>
        <skill>Django</skill>
    </skills>
</person>

但是XML过于冗长且沉重,难以阅读。
因此出现了JSONYAML


🤖 2. JSON: 夺取数据交换的王座

2001年,道格拉斯·克罗克福德(Douglas Crockford)推出了基于JavaScript对象表示法的JSON
"简单、轻量、机器易于理解的数据交换格式!"

JSON的目标很明确:
人类可以阅读,但计算机能更好地读取的结构
优化了浏览器和服务器之间的数据传输
与面向对象语言(JavaScript、Python等)自然衔接

JSON示例:

{
    "name": "Alice",
    "age": 25,
    "skills": ["Python", "Django"]
}
  • {}[]就能表达数据结构,
  • 因为网页中的JavaScript可以直接处理JSON,所以迅速普及。
  • 特别是因为在REST API中成为数据格式的标准,JSON最终夺取了王座。

🧐 3. YAML: 易于人理解的数据格式

但是也有希望获得比JSON更易读的格式的人。
"在表达数据结构时,如果没有多余的大括号和引号,不会更好吗?"

因此在2001年,YAML(Ain’t Markup Language)出现了。

name: Alice
age: 25
skills:
  - Python
  - Django

YAML的特点:
易于人类阅读(没有大括号和引号,干净利落!)
支持注释(可以使用#
便于在配置文件中使用

因此,YAML已成为配置文件的强者
在Kubernetes、Docker、Ansible、CI/CD和GitHub Actions等地方,默认使用YAML作为格式

但在数据交换市场上,YAML不敌JSON。
为什么呢? 🤔


🤯 4. YAML为什么没能打败JSON?

如果YAML易于阅读,本可以更流行……
但现实并非如此。

✅ JSON获胜的原因:
1. 语法太自由了?
- JSON通过{}[]结构明确,
- YAML使用缩进来表达结构,因此更容易出错
- 只需一个空格错误就会出错!(尤其是YAML的Tab与空格问题 🤯)

  1. 解析速度慢
  2. JSON可以快速解析,但是,
  3. 由于YAML语法灵活,需要解析的内容很多,所以速度慢
  4. 处理大量数据时比JSON更低效。

  5. YAML存在安全隐患

  6. YAML可以包含可执行代码(!python/object),
  7. 存在安全风险(RCE,远程代码执行)。
  8. JSON是纯数据,因此是安全的!

  9. 浏览器不支持

  10. JSON是JavaScript的基础对象结构,但,
  11. YAML需要使用额外的库。

因此,JSON被选择作为网络和数据交换的标准。


🚀 5. 但YAML夺得了配置文件的王座!

但YAML并没有消失。
虽然JSON成为数据交换的标准,但YAML已成为配置文件的标准。

🔥 YAML强大的原因

  • 支持注释 (#) → 写配置文件时方便
  • 人类易于阅读和修改
  • 在Kubernetes、Docker、Ansible等DevOps中作为核心格式使用

实际使用案例

  • docker-compose.yml
  • kubernetes.yml
  • github-actions.yml
  • ansible-playbook.yml

但要将YAML用于数据交换,需注意许多事项。
特别是在Django Rest Framework(DRF)中,也可以将序列化方式设置为YAMLRenderer,
但默认值仍然是JSONRenderer。

from rest_framework.renderers import JSONRenderer, YAMLRenderer
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    renderer_classes = [JSONRenderer, YAMLRenderer]

    def get(self, request):
        data = {"message": "Hello, YAML!"}
        return Response(data)

但大多数API的默认格式是JSON!
这是因为YAML由于解析速度和安全问题而不被广泛使用。

JSON vs YAML Medieval Battle


🎯 6. 结论:JSON vs YAML,谁更优秀?

✅ 选择JSON的时机:
- 网络API,数据交换(速度和稳定性重要!)
- NoSQL数据存储
- 在浏览器中直接使用时

✅ 选择YAML的时机:
- 配置文件(Kubernetes、Docker、CI/CD)
- 易于人类阅读的文档编写
- 与DevOps相关的工作

一句话总结:
🚀 "JSON是数据交换的王,YAML是配置文件的王!"