Data•
2025-06-21
•7 min
•alltools.one Team
JSONYAMLConversionConfigurationDevOps
JSON 轉 YAML:完整轉換指南
JSON 和 YAML 以不同的語法表達相同的資料結構。在大多數情況下,兩者之間的轉換很簡單,但在型別、多行字串和註解方面的邊界情況需要特別注意。本指南涵蓋兩種格式之間的完整對應關係。
語法對應
物件 / 映射
JSON:
{
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
YAML:
database:
host: localhost
port: 5432
name: myapp
陣列 / 序列
JSON:
{
"servers": ["web1", "web2", "web3"]
}
YAML:
servers:
- web1
- web2
- web3
巢狀結構
JSON:
{
"services": [
{
"name": "api",
"ports": [8080, 8443],
"env": {"NODE_ENV": "production"}
}
]
}
YAML:
services:
- name: api
ports:
- 8080
- 8443
env:
NODE_ENV: production
使用我們的 JSON 轉 YAML 轉換器 即時轉換。
需要注意的邊界情況
1. 註解
YAML 支援註解;JSON 不支援。當 YAML 轉換為 JSON 時,所有註解都會遺失:
# 這段註解在 JSON 中會消失
database:
host: localhost # 這段也會消失
2. 多行字串
YAML 擁有強大的多行語法,而 JSON 沒有:
description: |
This is a multi-line
string that preserves
line breaks.
在 JSON 中,這會變成:
{
"description": "This is a multi-line\nstring that preserves\nline breaks.\n"
}
3. 型別模糊
YAML 會自動偵測型別,這可能導致問題:
version: 1.0 # 浮點數,不是字串 "1.0"
port: 080 # 八進制 64,不是字串 "080"
country: NO # 布林值 false,不是字串 "NO"
在 JSON 中,型別是明確的:
{
"version": "1.0",
"port": "080",
"country": "NO"
}
從 JSON 轉換為 YAML 時,對可能被錯誤解讀的值加上引號。
4. Null 值
兩者都支援 null,但語法不同:
value: null # 明確表示
value: ~ # YAML 簡寫
value: # 空值 = null
{ "value": null }
5. 鍵中的特殊字元
JSON 鍵可以包含任何 Unicode 字元。YAML 中含特殊字元的鍵需要加引號:
"content-type": "application/json" # 連字號需要引號
simple_key: value # 底線沒問題
命令列轉換
使用 yq(YAML 處理器)
# JSON 轉 YAML
yq -P input.json > output.yaml
# YAML 轉 JSON
yq -o=json input.yaml > output.json
使用 Python
# JSON 轉 YAML
python3 -c "import json, yaml, sys; print(yaml.dump(json.load(sys.stdin), default_flow_style=False))" < input.json > output.yaml
# YAML 轉 JSON
python3 -c "import json, yaml, sys; print(json.dumps(yaml.safe_load(sys.stdin), indent=2))" < input.yaml > output.json
搭配使用 jq + yq
# 處理 JSON,輸出為 YAML
cat config.json | jq '.database' | yq -P
何時使用哪種格式
| 標準 | JSON | YAML |
|---|---|---|
| 人工編輯 | 較困難(括號、逗號) | 較容易(簡潔語法) |
| 機器解析 | 較快 | 較慢 |
| 註解 | 不支援 | 支援 |
| 資料交換 | 標準(API) | 少見 |
| 設定檔 | 可接受 | 推薦 |
| 嚴格性 | 嚴格(優點) | 彈性(有風險) |
使用 JSON 的場景:API 通訊、資料儲存、機器產生的設定、瀏覽器環境。
使用 YAML 的場景:人工編輯的設定檔、Docker Compose、Kubernetes、CI/CD 管線、Ansible。
如需更深入的比較,請參閱我們的 YAML vs JSON 文章。
常見問題
YAML 是 JSON 的超集嗎?
是的,自 YAML 1.2(2009 年)起,每個有效的 JSON 文件也是有效的 YAML。YAML 解析器可以直接解析 JSON。但反過來則不行——YAML 的功能如註解、錨點和多行字串在 JSON 中沒有對應。
JSON 和 YAML 哪個解析更快?
在幾乎所有語言中,JSON 的解析速度明顯更快。JSON 解析器更簡單,因為格式的語法較少。對於啟動時只載入一次的設定檔,差異可以忽略不計。對於高吞吐量的資料處理,JSON 是明確的選擇。
相關資源
- JSON 轉 YAML 轉換器 — 即時在格式之間轉換
- YAML vs JSON — 詳細的格式比較
- YAML 語法教學 — 從零開始學習 YAML