一、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 文件。
 - 表示复杂数据时更强大。
 - 版本控制友好