一 認識 YAML
YAML(發音 /ˈjæməl/)是一個類似 XML、JSON 的數據序列化語言。其強調以數據爲中心,旨在方便人類使用;並且適用於日常常見任務的現代編程語言。因而 YAML 本身的定義比較簡單,號稱“一種人性化的數據格式語言”。
YAML 的設計目標
人類容易閱讀
可用於不同程序間的數據交換
適合描述程序所使用的數據結構,特別是腳本語言
豐富的表達能力與可擴展性
易於使用
YAML 與 XML、JSON
YAML 與 XML
具有 XML 同樣的優點,但比 XML 更加簡單、敏捷等
YAML 與 JSON
1.JSON 可以看作是 YAML 的子集,也就是說 JSON 能夠做的事情,YAML 也能夠做
2.YAML 能表示得比 JSON 更加簡單和閱讀,例如“字符串不需要引號”。所以 YAML 容易可以寫成 JSON 的格式,但並不建議這種做。
3.YAML 能夠描述比 JSON 更加複雜的結構,例如“關係錨點”可以表示數據引用(如重複數據的引用)。
YAML 組織結構
YAML 文件可以由一或多個文檔組成(也即相對獨立的組織結構組成),文檔間使用“---”(三個橫線)在每文檔開始作爲分隔符。同時,文檔也可以使用“…”(三個點號)作爲結束符(可選)。如下圖所示:
1.如果只是單個文檔,分隔符“---”可省略。
2.每個文檔並不需要使用結束符“…”來表示結束,但是對於網絡傳輸或者流來說,作爲明確結束的符號,有利於軟件處理。(例如不需要知道流關閉就能知道文檔結束)
3.YAML 認爲數據由以下三種結構組成:(每個文檔由三種結構混合組成)
標量 (相當於數據類型)
序列 (相當於數組和列表)
鍵值表(相當於 Map 表)
二 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