一、YAML 简介
YAML(YAML Ain't Markup Language的缩写)是一种人类可读的完整的数据序列化语言。
YAML官网:The Official YAML Web Site
通常用作软件的配置文件;
文件的标准扩展名为 .yaml,也可接受.yml扩展名;
YAML基本语法规则(基于缩进的Block Style):
- 大小写敏感;
- 使用缩进表示层级关系(类似Python风格);
- 缩进不允许使用Tab制表符,只允许使用空格字符;
- 缩进的空格数不重要,但官方推荐使用2个空格字符;
Employees:
- dan:
name: Dan D. Veloper
job: Developer
team: DevOps
- dora:
name: Dora D. Veloper
job: Project Manager
team: Web Subscriptions
一个YAML文件或流可以包含多个文档Documents:
- 使用---区分每个文档,也可以显式地以---开头(可选的)。在规范中称此为指令结束标记,但实际使用中更多称为文档开始标记;
- 文档可以显式地以...结尾(可选的)。在规范中称此为文档结束标记,如果文档没有指令,可以省略---,仅用...来分割多个文档;
- 如果YAML文件或流仅包含一个文档,那么--- ...可以省略
---
player: playerOne
action: attack (miss)
---
player: playerTwo
action: attack (hit)
二、YMAL 语法
1.注释
YAML 允许使用注释,注释以“#”开头,直到行尾都是注释。注释可以用来解释代码或者标记代码。
# 这是一条注释
name: John Doe # 这是一个属性值
...
# 需要注意的是:在块标量中,缩进正确的以#开头的行,不会被解释为注释
literal: |
a
# no comment
b
# 等效于
quoted: "a\n# no comment\nb\n"
...
# 缩进不正确的以#开头的行,会被解释为注释,并结束当前块标量
folded: >
a
b
# a comment, end of block scalar
# 等效于
quoted: "a b\n"
...
# 可以直接在标头之后向块标量添加注释
literal: | # a block scalar
abc
def
folded: > # a block scalar
abc
def
...
2.yaml支持的数据结构有三种:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
-
纯量(scalars):单个的、不可再分的值。字符串、布尔值、整数、浮点数、Null、时间、日期
-
键值对
pair example:
- name: Yash
- job: student
# 等价于
pair example: [name: Yash, job: student]
我们将其称为冒号(:) 左侧的 Key,将其称为冒号(:) 右侧的 Value。
- 数组/列表
Fruits:
- Orange
- Apple
- Banana
----
Vegetables:
- Carrot
- Cauliflower
- Tomato
这就是我们表示列表的方式。
- 字典/映射
---
Banana:
calories: 105
fat: 0.4g
carbs: 27g
---
Grapes:
calories: 62
fat: 0.3g
carbs: 16g
- 集合
# 在 YAML 中,!!set 是一个内置的标签(tag),用于表示一个集合(set)数据结构。集合是一种无序的、不重复的元素集合。
names: !!set
? Yash
? Dhruv
? Rohit
# 等价于Python中的集合
{
'names': {'Yash', 'Dhruv', 'Rohit'}
}
- 字符串
#string: This is a comment
myself: "Yash"
job: "Student"
favgame: "Volleyball"
bio: |
Heyy myself Yash Pimple
I am an Introvert
#write a single line in multiple line
message: >
This will
be in single
line
#等价于
message: !!str This will be in single line
- 数字和布尔值:
number: 3564
marks: 95.68
booleanValue: !!bool No
# n, N, false, False, FALSE
# same for true -> yes, y, Y
- 如果要指定特定类型,则:
# 在 YAML 中,!!int 是一个内置的标签(tag),用于显式地指定一个整数(integer)类型。
zero: !!int 0
positiveNum: !!int 45
negativeNum: !!int -45
binaryNum: !!int 0b11001
octalNum: !!int 06574
hexa: !!int 0x45
commaValue: !!int +540_000 # 540,000
exponential numbers: 6.023E56
---
# !!float 用于显式地指定一个浮点数
marks: !!float 56.89
infinite: !!float .inf
not a num: .nan
- 让我们看看一些高级数据类型:
# !!seq 标签用于显式指定一个值为序列或列表类型。
student: !!seq
- marks
- name
- roll_no
# like this also
fruits: [banana, mango, apple]
# some of the keys of the seq will be empty
# sparse seq
sparse seq:
- hey
- how
-
- Null
- sup
# nested sequence
-
- mango
- apple
- banana
-
- marks
- roll num
- date
- 嵌套映射:映射内的映射
name: Yash Pimple
role:
age: 18
job: Student
#same as
name: Yash Pimple
role: { age: 18, job: Student}
- 键值对:
# pairs: keys may have duplicate values
# !!pairs 表示显示指定值为键值对
pair example: !!pairs
- job: student
- job: teacher
# same as
pair example: !!pairs [job: student, job: teacher]
# this will be an array of hashtables
- 通过锚重用属性
likings: &likes
fav fruit: mango
dislikes: grapes
person1:
name: Yash
<<: *likes
person2:
name: Dhruv
<<: *likes
dislikes: berries
# this will look like
person2:
name: Nishant
fav fruit: mango
dislikes: berries
person3:
name: Rohit
fav fruit: mango
dislikes: grapes
YAML 的好处:
- 简单易读
- 它具有严格的语法,因此标识很重要
- 可轻松转换为 JSON、XML 文件。
- 表示复杂数据时更强大。
- 版本控制友好