將 YAML 轉為 JSON(並避免縮排錯誤)

自 YAML 1.2 起,任何 JSON 文件都是合法的 YAML。將 YAML 設定轉為 JSON,並留意縮排與型別推論的陷阱。

YAML 與 JSON 是相關的

YAML 1.2 是 JSON 的嚴格超集,所以任何 JSON 文件都已經是合法的 YAML。把 YAML 轉成 JSON,主要是把基於縮排的結構改寫成花括號與方括號。

縮排規則

YAML 不允許用 tab 做縮排 —— 請用空格,並讓同層的鍵維持相同深度。一個不小心的 tab 或對不齊的鍵,是最常見的 YAML 解析錯誤。

挪威問題

未加引號的 NO、yes、on、off 在某些解析器裡會被讀成布林值,結果國家代碼 NO 就變成了 false。把這些值加引號,強迫它們保持為字串。

安全地轉換

先驗證 YAML,再轉換。把有歧義的純量加引號,並確認數字、日期、開頭為零的值仍然是你期望的型別。

多文件 YAML 串流

一個 YAML 檔案可以用 '---' 分隔多個文件。JSON 沒有對應的概念 —— 各自轉換每個文件,如果下游工具需要一次拿到全部,再把它們包成一個 JSON 陣列。Kubernetes manifest 是最常見的情境。

Anchor 與 alias

YAML 的 & anchor 與 * alias 允許用參考來重複使用節點,但 JSON 沒有別名機制。安全的轉換器會把每個 alias 解析成被錨定值的一份複本,這會讓文件變大。要注意:再轉回 YAML 會失去原本的共享關係。

YAML 在轉換時會失去的資訊

註解、像 !!binary 這樣的標籤註記、自訂 tag、block 與 flow 風格的差異以及鍵序,在 YAML 轉 JSON 時都會被丟掉。對純粹的資料交換來說沒問題;但對之後還會手動再編輯的設定檔,建議把 YAML 視為真正的來源檔。