YAML基础教程


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