## JSON vs YAML:為何JSON能穩坐資料交換的寶座? {#sec-7a866b84f44c} > 「明明YAML對人類來說更易讀,為何API通訊卻幾乎都只使用JSON?」 > 「YAML的優勢在哪裡?JSON又是基於什麼原因成為了標準?」 ![JSON vs 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:成為網頁資料交換的標準 {#sec-80d11bb3f8ce} 2001年,道格拉斯·克拉克福特 (Douglas Crockford) 從JavaScript的物件表示法中獲得靈感,創造了[[JSON]]。其核心理念是「盡可能輕量化,便於機器讀取」。 JSON的成功秘訣顯而易見: * **極致輕量:** 無需多餘裝飾,僅傳遞資料本身。 * **與網頁完美契合:** 瀏覽器 (JavaScript) 無需額外函式庫即可直接轉換為物件。 * **直觀的對應關係:** 與Python的Dict、JS的Object等現代程式語言的資料結構幾乎完全一致。 特別是隨著**REST API**成為網頁主流,JSON實際上已成為全球通用的語言。 --- ## 3. YAML:為人類閱讀而生的格式 {#sec-d6bd20dac978} 相較於JSON,也有陣營更專注於「人類閱讀的樂趣」。抱持著「能否在沒有大括號或引號的情況下,寫出更簡潔的內容?」的疑問,YAML應運而生。 ```yaml name: Alice age: 25 skills: - Python - Django ``` YAML的特點非常鮮明: * **極高的可讀性:** 基於縮排 (Indentation) 的特性,使得文字內容非常整潔。 * **支援註解 (`#`):** 相較於JSON,能夠添加「說明」是一大優勢。 * **設定檔的強者:** 憑藉其卓越的可讀性,它完全主導了Kubernetes、Docker、GitHub Actions等基礎設施設定的格式。 然而,為何在資料交換 (API) 領域,YAML未能超越JSON呢? --- ## 4. YAML在資料交換中落敗的現實原因 {#sec-9d0abeae52f7} **首先,縮排的嚴格性 (Space vs Tab)** JSON使用括號來定義結構,而YAML則是由看不見的空白字元來決定結構。在交換複雜資料時,一個錯誤的空白字元就可能導致難以排查的錯誤。 **其次,解析速度與資源消耗** JSON語法簡單,其解析器輕巧且快速。相較之下,YAML語法龐大且複雜(甚至包含程式碼執行功能),解析時會消耗更多記憶體和CPU。這對於處理大量資料的API環境來說是致命的。 **第三,安全問題** YAML不僅能表示單純的資料,還能包含直接呼叫特定語言物件的功能。這可能導致遠端程式碼執行 (RCE) 等安全漏洞,因此不適合用於與不特定多數對象交換資料的API。 --- ## 5. 歸根結底是「適材適用」的問題 {#sec-82859d40c1f9} 如果說[[JSON]]是資料交換的王者,那麼YAML就是設定檔的王者,兩者各自穩固了自身的領域。 * **何時使用JSON:** 網頁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/)