YAML

YAML Ain't a Markup Language (YAML) 是一種結構語言。

特點:可讀性高、以樹狀結構為主體。

結構性語言的實作通常沒統一規定,為了謹慎,樹狀結構通常是無序的,鏈狀結構通常是有序的。

與兩大對手的比較:

特性YAMLTOMLJson
主結構樹狀淺樹狀、鏈狀樹狀
語法YAMLTOMLJavaScript

以上三大結構語言都支援樹狀和鏈狀結構。 而基礎類型 bool, int, float, string 和自訂類型(由實作決定)都支援。

通常 TOML 和 YAML 應用於設定檔,Json 應用於網際間的資料傳遞(可以壓縮成一行減少體積)。 其中 Json 是 JavaScript 的 object 物件,所以可以直接被 JavaScript 讀取,有夾帶惡意程式碼的風險。

YAML 檔案的副檔名為 *.yaml,某些縮寫會用 *.yml

在往後的修訂中,YAML 會嘗試變成 Json 的子集語言,好讓一般的 Json 解析器可以讀取之。

Key Value

可以想像成 C++ 的 Map 或 Python 的 dict 容器,YAML 的語法如下:

# 註解
key: value
# bool
true
false
# int
123
0o14
0xC
# float(字母不分大小寫)
0.
1e-10
.nan
-.inf

其他的語法會被視為 string,而留白會被視為 null, nil 或 None 值(由實作決定)。 會違反 YAML 語法的 string 值必須被雙引號或單引號從頭到尾包起來。

version: "3.9"
title: "My: title"

Indentation

縮排是樹狀結構的主要語法,代表子節點。 YAML 的縮排通常為 2 空白,某些實作會對此嚴格限制。

A:
  B: B value
  C: C value

鏈狀結構則是可選縮排,但必須一致。

A:
- 1st
- 2nd
B:
  - 1st
  - 2nd

Flow Style

線性的表示法,與 Json 語法接近。

# 樹狀結構
A:
  B: B value
  C: C value
# 同於
A: {B: B value, C: C value}
# 鏈狀結構
B:
  - 1st
  - 2nd
# 同於
B: [1st, 2nd]

Reference

當樹狀結構出現重複內容時可以引用先前的資料。 使用 << 插入內容,而之後的 key 可以更新。

- &os
  name: Ubuntu
  version: 20.04
  platform: x64
  source:
    - main.cpp
  target: main
- <<: *os
  platform: x86
test1: &test
  build: true
  override: false
test2:
  <<: *test
  skip failed: true

Multiline String

字串太長時,為方便閱讀,可以手動折行,但是保持原本的單行狀態。

doc: aaa bbb
doc:
  aaa bbb
doc: "aaa
  bbb"
doc: >
  aaa
  bbb
doc: >-  # 忽略接續的空白行
  aaa
  bbb

想包含換行記號,除了用 \n 記號外,可以直接記錄換行狀態,但忽略縮排。

doc: aaa\nbbb
doc: |
  aaa
  bbb