TOML 轉 YAML:快速轉換指南附語法對照表與常見陷阱

A sleek, modern visual showing the transformation from TOML to YAML

將 TOML 轉換為 YAML 的最快方法是使用 yq -oy '.' file.toml。手動轉換時,將 TOML 的 [table] 標頭對應為 YAML 的縮排區塊,將 TOML 陣列對應為以短橫線開頭的清單,並且始終為有歧義的字串加上引號,以避免“挪威問題”。

快速轉換:使用 yq CLI

TOML(Tom’s Obvious, Minimal Language)在 2025 年 12 月發佈了v1.1.0 版本,但 YAML 仍然是 CI/CD 管線和 Kubernetes 清單的標準格式。yq 工具可以透過單一指令完成轉換。

安裝 yq

平台 指令
macOS/Linux brew install yq
Windows choco install yq
Python(pip) pip install yq

推薦使用 Mike Farah 開發的 Go 語言版本以獲得更快的速度。正如Mike Farah 的 yq 文件中所述,該工具會解碼 TOML 結構並重新編碼為整潔的 YAML。

執行轉換

在終端機中顯示:

yq -oy '.' your-config.toml

儲存至檔案:

yq -oy '.' your-config.toml > your-config.yaml

-oy 旗標將輸出格式設定為 YAML,可處理鍵值對、巢狀表和陣列。

簡單的 3 步終端機轉換流程

語法對照表:TOML 結構到 YAML

開發者 Drew DeVault 曾指出,雖然 TOML 很流行,但 YAML 在處理深層巢狀時更為簡潔。以下是精確的對應關係:

表格對應為縮排鍵

TOML 使用方括號標頭;YAML 使用縮排。

TOML YAML
[server] server:
host = "127.0.0.1" host: 127.0.0.1
port = 8080 port: 8080

關鍵差異:在 TOML 中,縮排僅用於美觀。而在 YAML 中,縮排是結構性的——哪怕一個空格錯誤都會導致整個設定檔失效。

陣列對應為短橫線清單

TOML: ports = [ 8000, 8001 ]

YAML:

ports:
  - 8000
  - 8001

TOML 與 YAML 結構並排比較

正如 Knightli.com 所解釋的,YAML 的“區塊樣式”使清單更易讀,前提是垂直對齊保持一致。

內聯表格和點分隔鍵

TOML 建構 YAML 等價形式
[a.b.c](點分隔標頭) a:b:c:(巢狀縮排)
point = { x = 1, y = 2 }(內聯表格) point:x: 1y: 2

實際應用場景

Hugo 靜態網站設定

Hugo 支援 hugo.tomlhugo.yamlhugo.json。大多數專案最初使用 TOML(預設格式),當設定需要與 Netlify 或 GitHub Actions 等部署平台保持一致時,再遷移到 YAML。Hammer Europe 指出,hugo 指令會讀取這些檔案來決定如何將 Markdown 轉換為線上網站。

Python 打包:pyproject.toml 到 CI/CD YAML

Python 社群透過 PEP 518pyproject.toml 標準化。這些設定通常需要轉換為 YAML 以用於 GitHub Actions CI/CD 工作流程。對於 AI 智慧代理工作流程,CocoIndex 報告指出,最佳化的 YAML 設定可以將使用量減少高達 70%。

挪威問題及其他轉換陷阱

NO 國家代碼錯誤

在 YAML 1.1 中,像 NOOFFYES 這樣的裸字串會被自動強制轉換為布林值 falsetrue。TOML 透過要求所有字串加引號來避免此問題。轉換時,務必為 YAML 中有歧義的值加上引號:

YAML 1.1 解釋 修正方式
NO false "NO"
OFF false "OFF"
YES true "YES"
On true "On"

YAML 1.2(目前規範)修正了大部分強制轉換問題,但許多解析器仍然預設使用 1.1 的行為。

“挪威問題”的視覺化比喻(布林值 vs 字串)

縮排錯誤

YAML 解析器會拒絕縮排不一致的檔案。常見錯誤包括:

  • 混用製表符和空格(YAML 禁止使用製表符)
  • 在一個區塊中使用 3 個空格,在另一個區塊中使用 2 個空格
  • 清單項目未對齊

AI 輔助產生

AgentBuilder 這樣的工具允許你用自然語言描述設定並輸出經過驗證的 YAML。這種“描述 → 產生 → 驗證”的循環有助於同時避免縮排錯誤和挪威問題。

總結

使用 yq -oy '.' file.toml 進行自動轉換。手動操作時,將 TOML 表格對應為 YAML 縮排,陣列對應為短橫線清單,並始終為可能被誤認為布林值的字串加上引號。轉換完成後,務必在部署前驗證 YAML 輸出——一個未對齊的空格或一個未加引號的 NO 就可能導致整個管線崩潰。

常見問題

YAML 支援像 TOML 那樣的註解嗎?

支援。兩者都使用 # 作為單行註解。YAML 註解可能會干擾多行字串解析,因此在不確定時,請將註解放在單獨的行上。

什麼是 YAML 中的“挪威問題”?

在 YAML 1.1 中,像 NO(挪威的國家代碼)這樣的裸字串會被自動轉換為布林值 false。TOML 透過要求所有字串值加引號來避免此問題。將 TOML 轉換為 YAML 時,請將任何可能有歧義的字串用引號包裹。

哪種格式更適合處理深層巢狀?

YAML。TOML 需要為每個層級重複像 [table.subtable.subsubtable] 這樣的長標頭,這會變得冗長。YAML 用縮排來表示相同的層級結構——在深層巢狀時更加緊湊和易讀。

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *