YAML簡介

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

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

  • 簡介 YAML 是一種簡潔的非標記語言。YAML以數(shù)據(jù)為中心,使用空白,縮進,分行組織數(shù)據(jù),從而使得表示更加簡潔易...
    柱柱007閱讀 766評論 0 0
  • 簡介 數(shù)據(jù)結(jié)構(gòu) 1. 對象 也可以寫成: 較為復雜的對象格式,可以使用問號加一個空格代表一個復雜的key,配合一個...
    上山走18398閱讀 1,035評論 0 0
  • 什么是yamlYAML是"YAML Ain't a Markup Language"(YAML不是一種置標語言)的...
    jackcooper閱讀 7,039評論 0 16
  • 信息標記的三種形式 信息的標記 信息在傳遞的過程中都需要加以標記,可通過標簽的方式,比如HTML,也可以通過鍵值對...
    3D打印老A閱讀 2,775評論 0 2
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,337評論 0 10

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