YAML 格式化工具
什麼是 YAML?
YAML 格式化工具會透過一致的縮排、換行和清楚結構,讓 YAML 檔案更容易閱讀。YAML 常用於 CI 設定、Kubernetes 清單、Docker Compose、靜態網站產生器、本地化、OpenAPI 檔案和應用設定。與 JSON 不同,YAML 非常依賴縮排、列表標記、冒號、引號、錨點和多行字串;一個很小的格式錯誤就可能產生完全不同的結構。這個工具能協助閱讀、整理並發現明顯語法問題,但不能取代 Schema 校驗或具體工具的規則檢查。用於 Kubernetes、GitHub Actions、Ansible 或正式配置時,應在目標系統中實際驗證。
使用方式
使用方式
- 在左側輸入方塊中貼上或輸入 YAML 資料
- 選擇符合您專案風格的縮排大小
- 點選「Format」美化、「Minify」縮減大小或「Validate」檢查語法
- 在右側檢視結果
- 點選「Copy」複製到剪貼簿
選項說明
鍵盤快速鍵
- Ctrl + Enter格式化
- Ctrl + Shift + C複製結果
YAML 小撇步
- YAML 對縮排非常敏感,格式化後用於 CI、Kubernetes 或部署檔案之前,請先檢視巢狀列表與映射結構。
- 盡可能根據目標工具的 schema 進行驗證;語法正確的 YAML 在 GitHub Actions、Docker Compose 或 OpenAPI 中仍可能無效。
使用場景
技術原理
YAML 格式化以 YAML 1.2.2 規範(2021 年 10 月修訂版)為基礎,該規範正式定義 JSON 為 YAML 的嚴格子集——任何合法的 JSON 文件都可作為 YAML 解析。解析分三個層次進行:展示層掃描 Unicode 碼點並解析字元跳脫;序列層建構由純量、序列和映射組成的節點圖;原生層套用 YAML Core Schema 將純量強制轉換為 `!!str`、`!!int`、`!!float`、`!!bool`、`!!null`、`!!seq`、`!!map` 等解析類型。常見的執行期函式庫包括 Node 上的 js-yaml 和較新的 `yaml` 套件、Python 上的 PyYAML 和 ruamel.yaml,以及 JVM 上的 SnakeYAML。瀏覽器端格式化器通常透過 js-yaml 的 `load`/`dump` 解析為純 JS 物件並進行往返。 縮排是核心基礎:僅允許 ASCII 空格(U+0020)——規範在 §6.1 中明確禁止使用 Tab 字元(U+0009)作為縮排,這就是為什麼從會自動轉換的程式碼編輯器貼上是最常見的解析失敗原因。區塊風格完全由欄位位置決定巢狀關係,因此子節點必須比父節點多至少一個空格的縮排(慣例為兩個)。流動風格借用 JSON 語法——`[1, 2, 3]` 和 `{a: 1, b: 2}`——可在區塊風格中巢狀使用以實現單行表達。區塊純量使用指示符驅動的折疊:`|`(字面量)精確保留換行,`>`(折疊)將單個換行折疊為空格並將空行保留為段落分隔符,而截斷指示符 `-`(去除尾部換行)和 `+`(保留所有尾部換行)附加在指示符之後(`|-`、`>+`)。引號規則不同:單引號純量將 `\` 視為字面量並使用 `''` 嵌入引號;雙引號純量遵循 C 風格跳脫(`\n`、`\t`、`\uXXXX`)。 格式化器通常正規化為一種區塊風格並重新發出錨點和別名。錨點 `&name` 標記一個節點;別名 `*name` 參考它;合併鍵 `<<: *name`(YAML 1.1 的遺留特性,大多數解析器仍支援)從另一個映射拉取鍵到當前映射。多文件串流以 `---` 起始標記和可選的 `...` 結束標記分隔,這是 Kubernetes 在一個清單中傳遞多個資源的模式。兩個眾所周知的陷阱值得注意:挪威問題——未加引號的純量 `no` 在 YAML 1.1 Schema 下被解釋為 `false`(國家代碼變成布林值)——以及 CVE-2017-18342,其中 PyYAML 的 `yaml.load` 反序列化了任意 Python 物件,修復方式是改用 `safe_load`。這兩個都是格式化器應謹慎處理純量解析且永遠不執行標籤建構子的原因。解析的時間複雜度相對於輸入長度為 O(n);大多數基於 AST 的函式庫會丟棄註釋,因為它們不屬於 YAML 資訊模型的一部分。
- 規範:YAML 1.2.2(2021 年 10 月)。JSON 是 YAML 1.2 的嚴格子集,因此任何合法的 JSON 文件都可作為 YAML 解析;常見函式庫有 js-yaml、`yaml` 套件、PyYAML、ruamel.yaml、SnakeYAML。
- 縮排必須使用 ASCII 空格(U+0020);Tab 字元(U+0009)在 §6.1 中被明確禁止用於縮排——這是最常見的 `mapping values are not allowed here` 錯誤原因。
- 區塊與流動風格:區塊使用欄位位置巢狀(慣例 2 或 4 空格);流動使用類似 JSON 的 `[1, 2, 3]` 和 `{a: 1}`。兩者可互相巢狀。
- 區塊純量:`|` 字面量精確保留換行,`>` 折疊將單個換行折疊為空格;截斷指示符 `-`(去除)和 `+`(保留)附加在指示符上,例如 `|-`、`>+`。
- 錨點 `&name` 標記節點,別名 `*name` 參考它們,合併鍵 `<<: *name` 從另一個映射拉取鍵(YAML 1.1 遺留特性,大多數解析器支援)。
- 多文件串流以 `---`(起始)和可選的 `...`(結束)標記分隔——Kubernetes 用此模式在一個清單中傳遞多個資源。
- 陷阱:挪威問題(未加引號的 `no`/`yes`/`on`/`off` 在 YAML 1.1 Schema 下被解析為布林值;YAML 1.2 Core Schema 已修正大部分情況)和 CVE-2017-18342(PyYAML `yaml.load` 任意程式碼執行;應使用 `safe_load`)。
範例
修正設定檔的縮排不一致
輸入(錯誤):
server:
port: 8080
host: localhost
debug: true
格式化後(2 個空格):
server:
port: 8080
host: localhost
debug: truedocker-compose.yml 的巢狀服務清單
version: '3.8'
services:
web:
image: nginx:1.25
ports:
- "80:80"
- "443:443"
depends_on:
- api
api:
image: node:20
environment:
NODE_ENV: productionKubernetes Deployment 描述檔
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
spec:
containers:
- name: web
image: nginx:1.25將 YAML 轉成 JSON 接到 jq 流水線
YAML 輸入:
user:
id: 42
name: alice
roles:
- admin
- editor
JSON 輸出:
{
"user": {
"id": 42,
"name": "alice",
"roles": ["admin", "editor"]
}
}捕捉冒號後遺漏空格的錯誤
輸入:
name:alice
age: 30
第 1 行錯誤:冒號後遺漏空格
修正後:
name: alice
age: 30常見問題
YAML 格式化會處理哪些事?
縮排正規化(通常為 2 個空白)、引號風格統一、清單記號對齊,以及把過長的 inline 集合改寫成區塊樣式。實務上多數 YAML 都是手動編輯而成,風格容易雜亂,本工具能將格式拉齊。
可以把 flow 樣式轉成 block 樣式嗎?
許多版本可讓你在 flow 樣式(類似 JSON 的 {key: value, key2: value2})與 block 樣式(多行縮排)之間切換。Block 較適合人類閱讀與編輯,flow 較精簡。兩者互轉時資料不變,但外觀會有差異。
為什麼它把我的引號改了?
YAML 同時支援不加引號、單引號與雙引號的字串,三者有微妙差異。yes/no、true/false、on/off 不加引號時會被解讀為布林;數字不加引號是數字、加引號是字串。為了避免誤判,本工具可能會自動加上引號以消除歧義。
註解會被保留嗎?
多數版本會保留 YAML 的註解(#),但相對於 AST 節點的位置可能會略有變動。鍵上方的註解通常仍留在上方,同一行尾端的註解也會跟著該行。格式化後請重新檢查註解位置是否仍合理。
YAML 內容會被上傳嗎?
不會。解析與格式化都透過 js-yaml 之類的程式庫在你的瀏覽器中進行,貼上的 YAML 不會被傳送。
為什麼往返轉換會改變 anchor 與 alias?
YAML 的 &(anchor)與 *(alias)語法可讓你定義一次值並重複引用。部分格式化器會預設展開 alias,導致重複資料失去去重效果。如果你的工具鏈依賴 anchor,請尋找保留 anchor 的選項。
我的 YAML 用 Tab 縮排怎麼辦?
YAML 不允許用 Tab 做縮排,必須使用空白。本工具通常會把 Tab 轉成空白,或直接拒絕解析(依設定而定)。如果遇到解析錯誤,請先把 Tab 替換成空白再貼上。