YAML语法简介
一、简介
YAML是YAML Ain't markup language
的缩写,它是一种计算机数据序列化语言。通常可以用来描述配置文件、日志文件、跨语言共享文件和数据共享。
YAML文档(document)以人类可读的文本形式表示计算机程序中的数据结构,YAML文档中的节点(node)有三种基本的数据类型:
- 标量(Scalar)
原子数据类型,例如:字符串、数字、布尔值和 null。
- 序列(Sequence)
节点列表(a list of nodes)
- 映射(Mapping)
节点到节点的映射,与许多编程语言不同,它的键(key)不仅仅是一个字符串,还可以是一个序列或映射本身。
二、语法样例
样例中以发票信息为例,发票信息包括:number
、name
、address
和items
。
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} ]