一、简介

YAML是YAML Ain't markup language的缩写,它是一种计算机数据序列化语言。通常可以用来描述配置文件、日志文件、跨语言共享文件和数据共享。

YAML文档(document)以人类可读的文本形式表示计算机程序中的数据结构,YAML文档中的节点(node)有三种基本的数据类型:

  • 标量(Scalar)

原子数据类型,例如:字符串、数字、布尔值和 null。

  • 序列(Sequence)

节点列表(a list of nodes)

  • 映射(Mapping)

节点到节点的映射,与许多编程语言不同,它的键(key)不仅仅是一个字符串,还可以是一个序列或映射本身。

二、语法样例

样例中以发票信息为例,发票信息包括:numbernameaddressitems

1、文档

一个YAML文件可以包含多个文档(Documents);文档以---开始,以...结束:

---
invoice number: 314159
name: Santa Claus
address: North Pole
...


---
invoice number: 314160
name: Santa Claus
address: North Pole
...

2、注释

注释以#开头,如果以#开头的行被正确的缩进,则它不会被解释为注释:

  a
  # no comment
  b

3、映射

key、value之间使用冒号和空格分隔:

invoice number: 314159
name: Santa Claus
address: North Pole

4、嵌套映射

嵌套映射中,key后面的冒号之后跟着换行符,非标量的映射值必须始终从新行开始;而且嵌套项必须始终比父节点缩进更多,至少有一个空格,通常是缩进是两个空格,禁止将制表符作为缩进:

invoice number: 314159
name: Santa Claus

address:
  street: Santa Claus Lane
  zip: 12345
  city: North Pole

5、序列

序列是标量(或其他序列、映射)的列表(或数组),序列项以连字符和空格开始:

a sequence:
- with
- three
- items
sequence:
-
  a: b
  c: d
# compact
sequence:
- a: b
  c: d
invoice number: 314159
name: Santa Claus
address:
  street: Santa Claus Lane
  zip: 12345
  city: North Pole

order items:
  - Sled
  - Wrapping Paper

6、嵌套序列

- - 2
  - 3
- - 3
  - 6

或更简洁的方式:

- [ 2, 3 ]
- [ 3, 6 ]

7、别名(Aliases)/锚(Anchors)

例如,发票信息中有送货地址和账单地址:

invoice number: 314159
name: Santa Claus

shipping address:
  street: Santa Claus Lane
  zip: 12345
  city: North Pole
billing address:
  street: Santa Claus Lane
  zip: 12345
  city: North Pole

如果是同一个地址是,可以使用别名避免重复:

invoice number: 314159
name: Santa Claus

shipping address: &address     #   Anchor
  street: Santa Claus Lane     # ┐
  zip: 12345                   # │ Anchor content
  city: North Pole             # ┘
billing address: *address      #   Alias

8、字符串

YAML是一种数据序列化语言,但是YAML文件用于许多不同的目的,并且有许多类型的字符串,特别是多行字符串;对于每种使用场景,可以选择使字符串易读和易于编辑的引号(或不用引号)类型。

共有五种表达字符串的方式:

  • 流式标量(Flow Scalars)

普通方式(plain)、使用单引号(single quoted)、使用双引号(double quoted):

plain scalars:
- a string with a \ backslash that doesn't need to be escaped
- can also use " quotes ' and $ a % lot /&?+ of other {} [] stuff
- a string
  on multiple lines

single quoted:
- '& starts with a special character, needs quotes'
- 'no need to escape backslash \ and double " quote'
- 'to express one single quote, use '' two of them'

double quoted:
- "here we can use predefined escape sequences like \t \n \b"
- "or generic escape sequences \x0b \u0041 \U00000041"
- "the double quote \" needs to be escaped"
- "just like the \\ backslash"
- "the single quote ' and other characters must not be escaped"
  • 块状标量(Block Scalars)

块状标量分为字面块标量(literal)和折叠块标量(folded)。

多行字符串:

# Block Scalar Styles
literal block scalar: |
  a multiline text
  line 2
  line 3

比较长的一行分成几个短的可读行:

# mnemonic: '>' is a folded '|'
folded block scalar: >
  a long line split into
  several short
  lines for readability

三、流式(Flow)风格

YAML以其基于缩进的块样式而闻名,每个序列项、键值对或标量都在单独的行上; 在很多情况上,更紧凑的样式是更有帮助的,它就是流式风格。

1、序列

---
perl:
- 5.8
- 5.10
- 5.12
- 5.14
- 5.16
- 5.18
- 5.20
- 5.22
- 5.24
- 5.26
- 5.28
- 5.30

流式风格:

---
perl: [5.8, 5.10, 5.12, 5.14, 5.16, 5.18, 5.20, 5.22, 5.24, 5.26, 5.28, 5.30]

2、映射

---
- x: 3
  y: 4
  z: 5
- x: 5
  y: 4
  z: 3

流式风格:

---
- {x: 3, y: 4, z: 5}
- {x: 5, y: 4, z: 3}

或者更紧凑的写法:

---
[ {x: 3, y: 4, z: 5}, {x: 5, y: 4, z: 3} ]
参考资料: