YAML是”YAML Ain't markup language"(YAML不是一種標記語言)的縮寫,是一種對人類設計友好(方便讀寫)的數(shù)據(jù)序列化語言,可以很好地與其它編程語言協(xié)同完成日常任務。
它是JSON的一個嚴格超集,在語法上增加了類似Python的換行和縮進。不過,與Python不同,YAML不允許使用Tab縮進。
基本規(guī)則
YAML有一些基本的規(guī)則,用來避免與各種編程語言和編輯器相關的歧義問題,這些基本的規(guī)則使得無論哪個應用程序或軟件庫都能一致地解析YAML。
- 文件名以
.yaml結(jié)尾 - 大小寫敏感
- 不允許使用Tab。由于Tab的支持性不夠普通,因此使用空格。
基本數(shù)據(jù)類型
YAML的基本數(shù)據(jù)類型與JSON一致,字符串、數(shù)字等標量類型,List、Map等容器類型。
YAML擅長處理映射表(哈希表 / 字典)、序列(數(shù)組 / 列表)和標量(字符串 / 數(shù)字)。
標量
最基礎的數(shù)據(jù)類型,包括布爾值、數(shù)字、字符串。
integer: 25
string: "25"
float: 25.0
boolean: Yes
序列
列表或者數(shù)組。每個item一行,以-開頭。
- Cat
- Dog
- Goldfish
同一層級的item是一個序列,可以用縮進來表示多層的序列。
-
- Cat
- Dog
- Goldfish
-
- Python
- Lion
- Tiger
可以是多層的:
-
-
- Cat
- Dog
- Goldfish
也可以這么寫:
--- Cat
- Dog
- Goldfish
映射表
鍵值對,如:
animal: pets
如果值是一個序列:
pets:
- Cat
- Dog
- Goldfish
5分鐘教程
--- # 文檔開頭
# YAML注釋類似這樣
################
# 標量類型 #
################
# 根對象是一個map,相當于其它語言中的dictionary、hash或者object。
key: value
another_key: Another value goes here.
a_number_value: 100
scientific_notation: 1e+12
# 數(shù)字1會被解析為數(shù)值類型,而不是布爾類型。如果希望被解析為布爾類型,請使用`true`
boolean: true
null_value: null
key with spaces: value
# 字符串不需要使用引號,不過可以使用。
however: 'A string, enclosed in quotes.'
'Keys can be quoted too.': "Useful if you want to put a ':' in your key."
single quotes: 'have ''one'' escape pattern'
double quotes: "have many: \", \0, \t, \u263A, \x0d\x0a == \r\n, and more."
# UTF-8/16/32的字符需要編碼
Superscript two: \u00B2
# 多行字符串可以寫作"literal block"(用'|')或者"folded block"(用'>')
literal_block: |
整塊文本都是'literal_block'的值,換行會被保留。
只要縮進的文本都包含在block中,首縮進會被去除。
多余的縮進會被保留 - 此行文字會縮進4個空格。
folded_style: >
整塊文本都是`folded_style`的值,不過所有的換行會被替換為一個。
上面的空行會被轉(zhuǎn)換為一個換行符。
多余的縮進依然會保留其換行 -
此段文字會展示為兩行。
####################
# 容器類型 #
####################
# 嵌套使用縮進。推薦使用2個空格的縮進(但不是必須的)。
a_nested_map:
key: value
another_key: Another Value
another_nested_map:
hello: hello
# Map的key可以是非字符串
0.25: a float key
# Key可以是復雜對象,像多行對象一樣,我們使用問號后跟一個空格來表示復雜Key的開始。
? |
This is a key
that has multiple lines
: and this is its value
# YAML還允許使用復雜Key語法在序列之間進行映射
# 某些語言的解析器可能會有警告
? - Manchester United
- Real Madrid
: [2001-01-01, 2002-02-02]
# 序列(List、Array等)這樣表示
# (注意,'-'算作縮進)
a_sequence:
- Item 1
- Item 2
- 0.5 # 序列可以包含不同的類型
- Item 4
- key: value
another_key: another_value
-
- This is a sequence
- inside another sequence
- - - Nested sequence indicators
- can be collapsed
# YAML是JSON的嚴格超集,因此可以使用JSON風格的map和序列
json_map: {"key": "value"}
json_seq: [3, 2, 1, "takeoff"]
and quotes are optional: {key: [3, 2, 1, takeoff]}
#######################
# YAML的額外特性 #
#######################
# YAML有一個方便特性“anchor",可以方便地在文檔中重復內(nèi)容。以下兩個key對應的值相同:
anchored_content: &anchor_name This string will appear as the value of two keys.
other_anchor: *anchor_name
# Anchor可以用來重復/繼承屬性
base: &base
name: Everyone has same name
# 正則表達式 << 稱作Merge Key Language-Independent Type,
# 表示將一個或多個map的所有key插入到當前map
foo: &foo
<<: *base
age: 10
bar: &bar
<<: *base
age: 20
# foo和bar都會包含name: Everyone has same name
# YAML還支持tag,用來顯式地聲明類型。
explicit_string: !!str 0.5 # 指明字符串類型
# 某些解析器實現(xiàn)了語言相關的tag,比如Python的復雜數(shù)值類型
python_complex_number: !!python/complex 1+2j
# 語言相關的tag可以與復雜key一起使用
? !!python/tuple [5, 7]
: Fifty Seven
# 在Python中值為{(5, 7): 'Fifty Seven'}
####################
# YAML的額外類型 #
####################
# YAML不僅可以理解字符串和數(shù)字這樣的基本類型,
# 也可以理解ISO格式的日期和時間字面量。
datetime: 2001-12-15T02:59:43.1Z
datetime_with_spaces: 2001-12-14 21:59:43.10 -5
date: 2002-12-14
# !!binary這個tag表示一個base64編碼的二進制對象
gif_file: !!binary |
R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
+f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
# YAML也支持集合類型:
set:
? item1
? item2
? item3
or: {item1, item2, item3}
# 集合其實是值為null的map;上面的寫法等同于:
set2:
item1: null
item2: null
item3: null
... # 文檔結(jié)尾