1. 認識 YAML
YAML(發音 /ˈjæməl/)是一個類似 XML、JSON 的資料序列化語言。其強調以資料為中心,旨在友善人類使用;并且适用于日常常見任務的現代程式設計語言。因而 YAML 本身的定義比較簡單,号稱“一種人性化的資料格式語言”。
1.1 YAML 的設計目标:
- 人類容易閱讀
- 可用于不同程式間的資料交換
- 适合描述程式所使用的資料結構,特别是腳本語言
- 豐富的表達能力與可擴充性
- 易于使用
1.2 YAML 與 XML、JSON
- YAML 與 XML
- 具有 XML 同樣的優點,但比 XML 更加簡單、靈活等
- YAML 與 JSON
- JSON 可以看作是 YAML 的子集,也就是說 JSON 能夠做的事情,YAML 也能夠做
- YAML 能表示得比 JSON 更加簡單和閱讀,例如“字元串不需要引号”。是以 YAML 容易可以寫成 JSON 的格式,但并不建議這種做
- YAML 能夠描述比 JSON 更加複雜的結構,例如“關系錨點”可以表示資料引用(如重複資料的引用)。
1.3 YAML 組織結構
YAML 檔案可以由一或多個文檔組成(也即相對獨立的組織結構組成),文檔間使用“---”(三個橫線)在每文檔開始作為分隔符。同時,文檔也可以使用“...”(三個點号)作為結束符(可選)。如下圖所示:

- 如果隻是單個文檔,分隔符“---”可省略。
- 每個文檔并不需要使用結束符“...”來表示結束,但是對于網絡傳輸或者流來說,作為明确結束的符号,有利于軟體處理。(例如不需要知道流關閉就能知道文檔結束) <br/>
YAML 認為資料由以下三種結構組成:(每個文檔由三種結構混合組成)
- 标量 (相當于資料類型)
- 序列 (相當于數組和清單)
- 鍵值表(相當于 Map 表)
2. YAML 編寫規範
它的基本文法規則如下:
1)大小寫敏感
2)使用縮進表示層級關系
3)縮進時不允許使用Tab鍵,隻允許使用空格。
4)縮進的空格數目不重要,隻要相同層級的元素左側對齊即可
- 規範一:文檔使用 Unicode 編碼作為字元标準編碼,例如 UTF-8
- 規範二:使用“#”來表示注釋内容
# 客戶訂單 date: 2015-02-01 customer: - name: Jai items: - no: 1234 # 訂單号 - descript: cpu
- 規範三:使用空格作為嵌套縮進工具。通常建議使用兩個空格縮進,不建議使用 tab (甚至不支援)
- 規範四:序清單示
- 使用“-”(橫線) + 單個空格表示單個清單項
--- # 文檔開始 - 第一章 簡介 - 第二章 設計目錄
- 使用"[]"表示一組資料
--- # 文檔開始 [blue, red, green]
- 組合表示。每個結構都可以嵌套組成複雜的表示結構。
--- # 文檔開始 - [blue, red, green] # 清單項本身也是一個清單 - [Age, Bag] - site: {osc:www.oschina.net, baidu: www.baidu.com} # 這裡是同 鍵值表 組合表示
- 使用“-”(橫線) + 單個空格表示單個清單項
- 規範五:鍵值表
- 使用 “:”(冒号) + 空格表示單個鍵值對
# 客戶訂單 date: 2015-02-01 customer: - name: Jai items: - no: 1234 # 訂單号 - descript: cpu - price: ¥800.00
- 使用"{}"表示一個鍵值表
# 客戶訂單 date: 2015-02-01 customer: - name: Jai items: {no: 1234, descript: cpu, price: ¥800.00}
- "? " 問号+空格表示複雜的鍵。當鍵是一個清單或鍵值表時,就需要使用本符号來标記。
# 使用一個清單作為鍵 ? [blue, reg, green]: Color # 等價于 ? - blue - reg - gree : Color
- 組合表示。每個結構都可以嵌套組成複雜的表示結構。
Color: - blue - red - green # 相當于 (也是 JSON 的表示) {Color: [blue, red, green]} div: - border: {color: red, width: 2px} - background: {color: green} - padding: [0, 10px, 0, 10px] # 使用縮進表示的鍵值表與清單項 items: - item: cpu model: i3 price: ¥800.00 - item: HD model: WD price: ¥450.00 # 上面使用 “-” 前導與縮進來表示多個清單項,相當于下面的JSON表示 items: [{item:cpu, model:i3, price:¥800.00}, {item:HD, model:WD, price: ¥450.00}]
- 使用 “:”(冒号) + 空格表示單個鍵值對
- 規範六:文本塊
- 使用 “|” 和文本内容縮進表示的塊:保留塊中已有的回車換行。相當于段落塊
yaml: | # 注意 ":" 與 "|" 之間的空格 JSON的文法其實是YAML的子集,大部分的JSON檔案都可以被YAML的解釋器解釋。
- 使用 “>” 和文本内容縮進表示的塊:将塊中回車替換為空格,最終連接配接成一行。
yaml: > # 注意 ":" 與 ">" 之間的空格,另外可以使用空行來分段落 JSON的文法其實是YAML的子集, 大部分的JSON檔案都可以被YAML的解釋器解釋。
- 使用定界符“”(雙引号)、‘’(單引号)或回車表示的塊:最終表示成一行。
yaml: # 使用回車的多行,最終連接配接成一行。 JSON的文法其實是YAML的子集, 大部分的JSON檔案都可以被YAML的解釋器解釋。 yaml: # 使用了雙引号,雙引号的好處是可以轉義,即在裡面可以使用特殊符号 "JSON的文法其實是YAML的子集, 大部分的JSON檔案都可以被YAML的解釋器解釋。"
- 使用 “|” 和文本内容縮進表示的塊:保留塊中已有的回車換行。相當于段落塊
- 規範七:資料類型的約定
- 對一些常用資料類型的表示格式進行了約定,包括:
integer: 12345 # 整數标準形式 octal: 0o34 # 八進制表示,第二個是字母 o hex: 0xFF # 十六進制表示 float: 1.23e+3 # 浮點數 fixed: 13.67 # 固定小數 minmin: -.inf # 表示負無窮 notNumber: .NaN # 無效數字 null: # 空值 boolean: [true, false] # 布爾值 string: '12345' # 字元串 date: 2015-08-23 # 日期 datetime: 2015-08-23T02:02:00.1z # 日期時間 iso8601: 2015-08-23t21:59:43.10-05:00 # iso8601 日期格式 spaced: 2015-08-23 21:59:43.10 -5 # ?
- “!”(歎号)顯式訓示類型,或自定義類型辨別。單歎号通常是自定義類型,雙歎号是内置類型
isString: !!str 2015-08-23 # 強調是字元串不是日期資料 picture: !!binary | # Base64 圖檔 R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs= #下面是内置類型 !!int # 整數類型 !!float # 浮點類型 !!bool # 布爾類型 !!str # 字元串類型 !!binary # 也是字元串類型 !!timestamp # 日期時間類型 !!null # 空值 !!set # 集合 !!omap, !!pairs # 鍵值清單或對象清單 !!seq # 序列,也是清單 !!map # 鍵值表 #下面是一些例子: --- !!omap - Mark: 65 - Sammy: 63 - Key: 58 --- !!set # 注意,“?”表示鍵為清單,在這裡清單為 null ? Mark ? Sammy ? Key # 下面是自定義的類型或辨別 %TAG ! tag:clarkevans.com,2002: # % 是指令符号 --- !shape # Use the ! handle for presenting # tag:clarkevans.com,2002:circle - !circle center: &ORIGIN {x: 73, y: 129} radius: 7 - !line start: *ORIGIN finish: { x: 89, y: 102 } - !label start: *ORIGIN color: 0xFFEEBB text: Pretty vector drawing.
- 對一些常用資料類型的表示格式進行了約定,包括:
- 規範八:錨點與引用,定義資料的複用。
- 第一步:使用 “&” 定義資料錨點(即要複制的資料)
- 第二步:使用 “*” 引用上述錨點資料(即資料的複制目的地)
--- hr: - Mark McGwire # Following node labeled SS - &SS Sammy Sosa # 定義要複制的資料 rbi: - *SS # Subsequent occurrence 這裡是資料複制目标 - Ken Griffey 詳盡文法見官網:http://www.yaml.org/spec/1.2/spec.html