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