本文引用自:https://www.cnblogs.com/BlogNetSpace/p/8444861.html
1. 認(rèn)識(shí) YAML
YAML(發(fā)音 /?j?m?l/)是一個(gè)類似 XML、JSON 的數(shù)據(jù)序列化語言。其強(qiáng)調(diào)以數(shù)據(jù)為中心,旨在方便人類使用;并且適用于日常常見任務(wù)的現(xiàn)代編程語言。因而 YAML 本身的定義比較簡單,號稱“一種人性化的數(shù)據(jù)格式語言”。
1.1 YAML 的設(shè)計(jì)目標(biāo):
人類容易閱讀
可用于不同程序間的數(shù)據(jù)交換
適合描述程序所使用的數(shù)據(jù)結(jié)構(gòu),特別是腳本語言
豐富的表達(dá)能力與可擴(kuò)展性
易于使用
1.2 YAML 與 XML、JSON
-
YAML 與 XML
- 具有 XML 同樣的優(yōu)點(diǎn),但比 XML 更加簡單、敏捷等
-
YAML 與 JSON
JSON 可以看作是 YAML 的子集,也就是說 JSON 能夠做的事情,YAML 也能夠做
YAML 能表示得比 JSON 更加簡單和閱讀,例如“字符串不需要引號”。所以 YAML 容易可以寫成 JSON 的格式,但并不建議這種做
YAML 能夠描述比 JSON 更加復(fù)雜的結(jié)構(gòu),例如“關(guān)系錨點(diǎn)”可以表示數(shù)據(jù)引用(如重復(fù)數(shù)據(jù)的引用)。
1.3 YAML 組織結(jié)構(gòu)
YAML 文件可以由一或多個(gè)文檔組成(也即相對獨(dú)立的組織結(jié)構(gòu)組成),文檔間使用“---”(三個(gè)橫線)在每文檔開始作為分隔符。同時(shí),文檔也可以使用“...”(三個(gè)點(diǎn)號)作為結(jié)束符(可選)。如下圖所示:
如果只是單個(gè)文檔,分隔符“---”可省略。
每個(gè)文檔并不需要使用結(jié)束符“...”來表示結(jié)束,但是對于網(wǎng)絡(luò)傳輸或者流來說,作為明確結(jié)束的符號,有利于軟件處理。(例如不需要知道流關(guān)閉就能知道文檔結(jié)束)
YAML 認(rèn)為數(shù)據(jù)由以下三種結(jié)構(gòu)組成:(每個(gè)文檔由三種結(jié)構(gòu)混合組成)
標(biāo)量 (相當(dāng)于數(shù)據(jù)類型)
序列 (相當(dāng)于數(shù)組和列表)
鍵值表(相當(dāng)于 Map 表)
2. YAML 編寫規(guī)范
它的基本語法規(guī)則如下:
1)大小寫敏感
2)使用縮進(jìn)表示層級關(guān)系
3)縮進(jìn)時(shí)不允許使用Tab鍵,只允許使用空格。
4)縮進(jìn)的空格數(shù)目不重要,只要相同層級的元素左側(cè)對齊即可
規(guī)范一:文檔使用 Unicode 編碼作為字符標(biāo)準(zhǔn)編碼,例如 UTF-8
-
規(guī)范二:使用“#”來表示注釋內(nèi)容
# 客戶訂單 date: 2015-02-01 customer: - name: Jai items: - no: 1234 # 訂單號 - descript: cpu
規(guī)范三:使用空格作為嵌套縮進(jìn)工具。通常建議使用兩個(gè)空格縮進(jìn),不建議使用 tab (甚至不支持)
-
規(guī)范四:序列表示
-
使用“-”(橫線) + 單個(gè)空格表示單個(gè)列表項(xiàng)
--- # 文檔開始 - 第一章 簡介 - 第二章 設(shè)計(jì)目錄
-
使用"[]"表示一組數(shù)據(jù)
--- # 文檔開始 [blue, red, green]
-
組合表示。每個(gè)結(jié)構(gòu)都可以嵌套組成復(fù)雜的表示結(jié)構(gòu)。
--- # 文檔開始 - [blue, red, green] # 列表項(xiàng)本身也是一個(gè)列表 - [Age, Bag] - site: {osc:www.oschina.net, baidu: www.baidu.com} # 這里是同 鍵值表 組合表示
-
-
規(guī)范五:鍵值表
-
使用 “:”(冒號) + 空格表示單個(gè)鍵值對
# 客戶訂單 date: 2015-02-01 customer: - name: Jai items: - no: 1234 # 訂單號 - descript: cpu - price: ¥800.00
-
使用"{}"表示一個(gè)鍵值表
# 客戶訂單 date: 2015-02-01 customer: - name: Jai items: {no: 1234, descript: cpu, price: ¥800.00}
-
"? " 問號+空格表示復(fù)雜的鍵。當(dāng)鍵是一個(gè)列表或鍵值表時(shí),就需要使用本符號來標(biāo)記。
# 使用一個(gè)列表作為鍵 ? [blue, reg, green]: Color # 等價(jià)于 ? - blue - reg - gree : Color
-
組合表示。每個(gè)結(jié)構(gòu)都可以嵌套組成復(fù)雜的表示結(jié)構(gòu)。
Color: - blue - red - green # 相當(dāng)于 (也是 JSON 的表示) {Color: [blue, red, green]} div: - border: {color: red, width: 2px} - background: {color: green} - padding: [0, 10px, 0, 10px] # 使用縮進(jìn)表示的鍵值表與列表項(xiàng) items: - item: cpu model: i3 price: ¥800.00 - item: HD model: WD price: ¥450.00 # 上面使用 “-” 前導(dǎo)與縮進(jìn)來表示多個(gè)列表項(xiàng),相當(dāng)于下面的JSON表示 items: [{item:cpu, model:i3, price:¥800.00}, {item:HD, model:WD, price: ¥450.00}]
-
-
規(guī)范六:文本塊
-
使用 “|” 和文本內(nèi)容縮進(jìn)表示的塊:保留塊中已有的回車換行。相當(dāng)于段落塊
yaml: | # 注意 ":" 與 "|" 之間的空格 JSON的語法其實(shí)是YAML的子集,大部分的JSON文件都可以被YAML的解釋器解釋。
-
使用 “>” 和文本內(nèi)容縮進(jìn)表示的塊:將塊中回車替換為空格,最終連接成一行。
yaml: > # 注意 ":" 與 ">" 之間的空格,另外可以使用空行來分段落 JSON的語法其實(shí)是YAML的子集, 大部分的JSON文件都可以被YAML的解釋器解釋。
-
使用定界符“”(雙引號)、‘’(單引號)或回車表示的塊:最終表示成一行。
yaml: # 使用回車的多行,最終連接成一行。 JSON的語法其實(shí)是YAML的子集, 大部分的JSON文件都可以被YAML的解釋器解釋。 yaml: # 使用了雙引號,雙引號的好處是可以轉(zhuǎn)義,即在里面可以使用特殊符號 "JSON的語法其實(shí)是YAML的子集, 大部分的JSON文件都可以被YAML的解釋器解釋。"
-
-
規(guī)范七:數(shù)據(jù)類型的約定
-
對一些常用數(shù)據(jù)類型的表示格式進(jìn)行了約定,包括:
integer: 12345 # 整數(shù)標(biāo)準(zhǔn)形式 octal: 0o34 # 八進(jìn)制表示,第二個(gè)是字母 o hex: 0xFF # 十六進(jìn)制表示 float: 1.23e+3 # 浮點(diǎn)數(shù) fixed: 13.67 # 固定小數(shù) minmin: -.inf # 表示負(fù)無窮 notNumber: .NaN # 無效數(shù)字 null: # 空值 boolean: [true, false] # 布爾值 string: '12345' # 字符串 date: 2015-08-23 # 日期 datetime: 2015-08-23T02:02:00.1z # 日期時(shí)間 iso8601: 2015-08-23t21:59:43.10-05:00 # iso8601 日期格式 spaced: 2015-08-23 21:59:43.10 -5 # ?
-
“!”(嘆號)顯式指示類型,或自定義類型標(biāo)識(shí)。單嘆號通常是自定義類型,雙嘆號是內(nèi)置類型
isString: !!str 2015-08-23 # 強(qiáng)調(diào)是字符串不是日期數(shù)據(jù) picture: !!binary | # Base64 圖片 R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs= #下面是內(nèi)置類型 !!int # 整數(shù)類型 !!float # 浮點(diǎn)類型 !!bool # 布爾類型 !!str # 字符串類型 !!binary # 也是字符串類型 !!timestamp # 日期時(shí)間類型 !!null # 空值 !!set # 集合 !!omap, !!pairs # 鍵值列表或?qū)ο罅斜? !!seq # 序列,也是列表 !!map # 鍵值表 #下面是一些例子: --- !!omap - Mark: 65 - Sammy: 63 - Key: 58 --- !!set # 注意,“?”表示鍵為列表,在這里列表為 null ? Mark ? Sammy ? Key # 下面是自定義的類型或標(biāo)識(shí) %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.
-
-
規(guī)范八:錨點(diǎn)與引用,定義數(shù)據(jù)的復(fù)用。
第一步:使用 “&” 定義數(shù)據(jù)錨點(diǎn)(即要復(fù)制的數(shù)據(jù))
-
第二步:使用 “*” 引用上述錨點(diǎn)數(shù)據(jù)(即數(shù)據(jù)的復(fù)制目的地)
--- hr: - Mark McGwire # Following node labeled SS - &SS Sammy Sosa # 定義要復(fù)制的數(shù)據(jù) rbi: - *SS # Subsequent occurrence 這里是數(shù)據(jù)復(fù)制目標(biāo) - Ken Griffey
詳盡語法見官網(wǎng):http://www.yaml.org/spec/1.2/spec.html