alltools.one
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

何時使用哪種格式

標準JSONYAML
人工編輯較困難(括號、逗號)較容易(簡潔語法)
機器解析較快較慢
註解不支援支援
資料交換標準(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 是明確的選擇。

相關資源

Published on 2025-06-21
JSON to YAML Conversion: A Complete Migration Guide | alltools.one