YAML 集合類型:Map 與 List

在認識了基礎的「純量」後,接著我們要學習如何將資料組織起來。YAML 提供兩種核心的集合結構:Map (映射)List (列表)

這兩者的組合能讓你表達極其複雜的資料關係。

Map (映射/字典/物件)

Map 是由「鍵值對」組成的集合,類似於程式語言中的 Dictionary、Hash 或 Object。

基本寫法 (Block Style)

在 YAML 中,這是最常見的寫法,每個鍵佔一行,並使用縮排表示層級。

# 一個簡單的 Map
user:
  id: 101
  name: 'Alice'
  role: 'Admin'

流式寫法 (Flow Style)

如果你希望更精簡,可以使用類似 JSON 的大括號 {}。這在撰寫簡單的巢狀結構時非常方便。

# 與上方等效的流式寫法
user: { id: 101, name: 'Alice', role: 'Admin' }

List (列表/陣列/序列)

List 是一組有序的資料集合,類似於程式語言中的 Array。

基本寫法 (Block Style)

使用一個「減號 -」加上一個空格。

# 一個簡單的 List
skills:
  - 'Python'
  - 'Go'
  - 'Docker'

流式寫法 (Flow Style)

使用中括號 [],並以逗點分隔。

# 與上方等效的流式寫法
skills: ['Python', 'Go', 'Docker']

巢狀組合 (Nested Structures)

YAML 的強大之處在於你可以隨意組合 Map 與 List。

List 中包含 Map

這是處理一系列物件時最常用的格式(例如 Kubernetes 的環境變數設定)。

# 使用者列表
employees:
  - name: 'Mike'
    department: 'IT'
  - name: 'Jerry'
    department: 'Sales'

Map 中包含 List

用於表示一個鍵擁有多個值(例如標籤、分類)。

# 文章資訊
post:
  title: 'YAML 教學'
  tags:
    - Tutorial
    - Config
    - Dev
YAML 本身並不限制縮排的格數(只要同一階層對齊即可),但全球開發者社群已達成高度共識:始終使用 2 個空格作為縮排標準,絕對不要使用 Tab。

關鍵的縮排與空格規則 (Indentation Rules)

縮排是 YAML 的靈魂,錯誤的縮排會導致資料結構完全被解讀錯誤。

Map 的縮排

子項名稱的「開頭」必須比父項名稱的「開頭」更靠右。

# 正確:child 比 parent 靠右
parent:
  child: value

# 錯誤:沒有縮排,child 會被視為與 parent 同級
parent:
child: value

List 的縮排(重點!)

清單項目的減號 - 相對於父鍵,可以選擇「縮排」或「不縮排」(對齊父鍵),這兩種寫法在 YAML 中都是合法的,但同一檔案內應保持一致。

# 寫法 A:減號縮排(推薦,階層感較明顯)
fruits:
  - Apple
  - Banana

# 寫法 B:減號對齊父鍵
fruits:
- Apple
- Banana

3. List 中包含 Map 的「緊湊式」縮排

這是最常見的「物件陣列」寫法。當 List 的項目是一個 Map 時,通常會將 Map 的第一個鍵緊接在減號後面。

# 專業的緊湊寫法
users:
  - id: 1
    name: 'Alice'
  - id: 2
    name: 'Bob'

# 注意:第二行開始的 'name' 必須對齊第一行的 'id'

常見錯誤清單

❌ 冒號與減號後忘記空格

冒號 : 與減號 - 之後必須接一個空格,否則 YAML 解析器會將其視為字串的一部分。

invalid:key       # 冒號後沒空格(錯誤)
-item             # 減號後沒空格(錯誤)

❌ 使用 Tab 進行縮排

YAML 規格書嚴格禁止使用 Tab 鍵進行排版。如果你在編輯器中按了 Tab,請確保你的編輯器設定會自動將其轉為空格。

❌ 同一階層未對齊

屬於同一個集合的項目,左側的起始位置必須完全一致。

# 錯誤:Banana 沒有對齊 Apple
list:
  - Apple
    - Banana

學會了如何組織資料後,你已經能處理 80% 的 YAML 場景了。