YAML簡(jiǎn)介

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é)尾
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • YAML是”YAML Ain't markup language"(YAML不是一種標(biāo)記語(yǔ)言)的縮寫(xiě),是一種對(duì)人類...
    光明自在閱讀 3,723評(píng)論 0 1
  • 簡(jiǎn)介 YAML 是一種簡(jiǎn)潔的非標(biāo)記語(yǔ)言。YAML以數(shù)據(jù)為中心,使用空白,縮進(jìn),分行組織數(shù)據(jù),從而使得表示更加簡(jiǎn)潔易...
    柱柱007閱讀 762評(píng)論 0 0
  • 簡(jiǎn)介 數(shù)據(jù)結(jié)構(gòu) 1. 對(duì)象 也可以寫(xiě)成: 較為復(fù)雜的對(duì)象格式,可以使用問(wèn)號(hào)加一個(gè)空格代表一個(gè)復(fù)雜的key,配合一個(gè)...
    上山走18398閱讀 1,033評(píng)論 0 0
  • 什么是yamlYAML是"YAML Ain't a Markup Language"(YAML不是一種置標(biāo)語(yǔ)言)的...
    jackcooper閱讀 7,034評(píng)論 0 16
  • 信息標(biāo)記的三種形式 信息的標(biāo)記 信息在傳遞的過(guò)程中都需要加以標(biāo)記,可通過(guò)標(biāo)簽的方式,比如HTML,也可以通過(guò)鍵值對(duì)...
    3D打印老A閱讀 2,769評(píng)論 0 2

友情鏈接更多精彩內(nèi)容