"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更受歡迎,但是…
現實並非如此。

✅ JSON獲勝的理由:
1. 語法過於自由?
- JSON的結構清晰,使用{}[]
- 而YAML使用縮排表達結構,易出錯
- 只需一個空格錯誤就會出錯! (尤其是YAML的Tab vs Space問題 🤯)

  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是配置文件之王!"