1、yaml簡述
YAML是一個類似 XML、JSON 的標記性語言。YAML 強調以數據為中心,並不是以標識語言為重點。因而YAML 本身的定義比較簡單,號稱“一種人性化的數據格式語言”。
2、適用場景
2.1 腳本語言
由於實現簡單,解析成本很低,YAML特別適合在腳本語言中使用。列一下現有的語言實現:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript,Go 。除了Java 和 Go,其他都是腳本語言。
2.2序列化
YAML比較適合做序列化。因為它是宿主語言數據類型直轉的。
2.3 配置文件
YAML做配置文件也不錯。寫YAML要比寫XML快得多(無需關注標簽或引號),並且比ini文檔功能更強。
3、數據結構
YAML 認為數據由以下三種結構組成: 標量,序列,鍵值表。
標量:單個的、不可再分的值,如:數字,字符串
數組:一組按次序排列的值,如:python中的列表
鍵值表:鍵值對的集合,如:python中的字典
5、語法約定
- 大小寫敏感
- '#'表示注釋
- 使用 Unicode 編碼作為字符標准編碼
- 字符串默認不需要引號,如果字符串包含空格或者特殊字符(例如冒號),需要加引號
- 使用縮進表示層級關系,縮進不允許使用tab,只允許空格,縮進的空格數不重要,只要相同層級的元素左對齊即可
6、格式規范
6.1 標量
integer: 12345 # 整數標准形式
octal: 0o34 # 八進制表示,以0o開頭
hex: 0xFF # 十六進制表示,以0x開頭
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 日期格式
6.2 數組
- 使用“-”(橫線)+單個空格表示單個列表項
- 使用"[]"表示一組數據,一組數據用”,”隔開,”[“,”]”,逗號前后有無空格都可以
- 組合表示。每個結構都可以嵌套組成復雜的表示結構。
6.3 鍵值表
- 使用 “:”(冒號) + 空格表示單個鍵值對
- 使用"{}"表示一個鍵值表,一組數據用”,”隔開,”[“,”]”,逗號前后有無空格都可以
- 組合表示。每個結構都可以嵌套組成復雜的表示結構。
6.4 文本塊
- 使用定界符“”(雙引號)、‘’(單引號)和回車表示的塊:最終表示成一行,雙引號不對特殊字符進行轉義。
- 使用 “|” 和文本內容縮進表示的塊:保留塊中已有的回車換行。
- 使用 “>” 和文本內容縮進表示的塊:將塊中回車替換為空格,最終連接成一行。
6.5 “!”
- 顯式指示類型,或自定義類型標識。
- 單嘆號通常是自定義類型,雙嘆號是內置類型
!!int # 整數類型
!!float # 浮點類型
!!bool # 布爾類型
!!str # 字符串類型
!!binary # 也是字符串類型
!!timestamp # 日期時間類型
!!null # 空值
!!set # 集合
!!omap, !!pairs # 鍵值列表或對象列表
!!seq # 序列,也是列表
!!map # 鍵值表
6.6 錨點與引用
- 使用 “&” 定義數據錨點(即要復制的數據)
- 使用 “*” 引用上述錨點數據(即數據的復制目的地)
7、YAML 組織結構
YAML 文件可以由一或多個文檔組成(也即相對獨立的組織結構組成),文檔間使用“---”(三個橫線)在每文檔開始作為分隔符。同時,文檔也可以使用“...”(三個點號)作為結束符(可選)。
- 如果只是單個文檔,分隔符“---”可省略。
- 每個文檔並不需要使用結束符“...”來表示結束,但是對於網絡傳輸或者流來說,作為明確結束的符號,有利於軟件處理。
8、拓展
- YAML 與 XML
具有 XML 同樣的優點,但比 XML 更加簡單、敏捷等
- YAML 與 JSON
- JSON 可以看作是 YAML 的子集,也就是說 JSON 能夠做的事情
- YAML 也能夠做,YAML 能表示得比 JSON 更加簡單和閱讀,例如“字符串不需要引號”。所以 YAML 容易可以寫成 JSON 的格式,但並不建議這種做
- YAML 能夠描述比 JSON 更加復雜的結構,例如“關系錨點”可以表示數據引用(如重復數據的引用)。