JSON 和 YAML 該怎麼選
結論:JSON 用括號劃邊界、YAML 用縮排表達層級。機器互動選 JSON,人寫設定選 YAML;兩者可以互轉,但註解、錨點、多文件這些特性在轉換中會丟。

結論:機器之間傳輸資料用 JSON,人手動維護的設定用 YAML;需要註解、多行文字或錨點複用時優先 YAML,需要對所有語言無歧義解析時優先 JSON。
直觀對比
{
"server": {
"host": "127.0.0.1",
"port": 8080
}
}
server:
host: 127.0.0.1
port: 8080
同一個結構,YAML 少了幾個符號,也多了一個寫註解的位置。
差異在哪
| 維度 | JSON | YAML |
|---|---|---|
| 層級表達 | 括號、逗號 | 縮排 |
| 註解 | 不支援 | 支援 |
| 字串 | 必須雙引號,需轉義 | 多數情況不用引號 |
| 多行文字 | 轉義 \n 或用陣列拼 |
` |
| 重複利用 | 無 | 錨點 & 與引用 * |
| 多文件 | 需要外層包陣列 | --- 分隔 |
| 解析速度 | 快,語法簡單 | 慢,縮排規則複雜 |
| 歧義風險 | 極低 | 縮排錯一格、no 被當布林 |
最後一行是 YAML 的真正代價。country: NO 裡的 NO 在 YAML 1.1 裡是布林 false,version: 1.0 可能被解析成浮點數而不是字串。JSON 沒有這類隱式型別推斷。
具體怎麼定
選 JSON:介面請求與回應、服務間訊息、資料庫 JSON 欄位、需要多語言多工具無差別解析的資料。
選 YAML:Kubernetes、Ansible、GitHub Actions、Docker Compose 這類生態預設就是 YAML 的場景;需要寫註解解釋每個欄位;有大量多行文字(憑證、腳本、SQL)。
互轉時會丟什麼
從 YAML 轉 JSON:註解全部遺失、錨點被展開成重複內容、多文件只能保留第一個、日期與布林等隱式型別被固化。
從 JSON 轉 YAML:數字與字串的區分可能被弱化,"8080" 和 8080 都需要顯式引號才安全。
所以互轉適合「一次性遷移」或「臨時查看」,不適合把兩種格式當成同一份檔案的兩個視圖長期雙向同步。
常見問題
如何判斷一份設定該用 JSON 還是 YAML?
先看這份檔案的讀者和維護方式:由程式自動產生、跨語言傳輸、需要長期穩定解析,就用 JSON;由人手動編輯、需要解釋欄位或保存多行文字,就用 YAML。兩者可以互轉,但不建議把同一份設定長期維護成兩種格式。
為什麼 YAML 更容易出現型別歧義?
YAML 有隱式型別推斷,NO、on、1.0 這類值可能被解析成布林、日期或數字。JSON 只有顯式型別,寫字串就必須加雙引號,因此跨語言解析時更可預測。
YAML 轉成 JSON 時是否會遺失註解和錨點?
會。YAML 的註解、錨點引用和多文件結構在轉成 JSON 後無法保留,錨點會被展開成重複內容。需要保留這些資訊時,應使用支援 Document API 的 YAML 函式庫,而不是做物件往返。