YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

在线编辑器:YAML、YML在线编辑器(格式化校验)-BeJSON.com

YAML介绍

YAML 的配置文件后缀为 .yml,如:daokun.yml

image-20240515143505116

YAML现在很受欢迎,很多的配置文件都是由YAML写的

image-20240515143318031

YAML和其他语言的对比,对比XMLJSON更加的简洁,更容易阅读

image-20240515143601857

基本语法

  • 大小写敏感

    1
    2
    daokun: 1
    Daokun: 2
  • 使用缩进表示层级关系

  • 缩进不允许使用tab,只允许空格

  • 缩进的空格数不重要,只要相同层级的元素左对齐即可

    1
    2
    3
    4
    5
    6
    7
    8
    person:
    name: daokun
    age: 22
    gender: male
    card:
    BOC: 20RMB
    ICBC: 15RMB
    ABC: 90RMB
  • ‘#’表示注释

    1
    # 这就是一个注释,和python单行注释一样
  • 一个文件中可以包含多个文件的内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # --- 三个破折号表示一份内容的开始
    # ... 三个小数点表示一份内容的结束(非必需)

    ---
    # 这是第一份内容
    ...

    ---
    # 这是第二份内容
    ...

数据类型

对象(Mapping)

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

注意冒号后面要加一个空格!

1
key: value

支持多层嵌套

1
2
3
person:
person1: daokun
person2: afu

支持流式风格( Flow style)的语法(用花括号包裹,用逗号加空格分隔,类似 JSON)

1
person: { person1: daokun, person2: afu}

使用问号“?”声明一个复杂对象,允许你使用多个词汇(数组)来组成键

1
2
3
4
5
6
?  
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
image-20240515151758404

数组

破折号+空格

1
2
3
4
5
6
person:
- daokun
- afu
- ale
- piaoke
- liuzhi

也支持内联格式(Inline Format)来表达(用方括号包裹,逗号加空格分隔,类似 JSON)

1
person: [daokun, afu, ale, piaoke, liuzhi ]

支持多维数组(用缩进表示层级关系

1
2
3
4
5
6
7
8
person:
- man:
- afu
- daokun
- woman:
- linyin
- xuanyin

纯量(标量)

纯量(scalars):单个的、不可再分的值

字符串

字符串一般不需要用引号包裹,但是如果字符串中使用了反斜杠“\”开头的转义字符就必须使用引号包裹

1
2
3
4
5
6
7
8
9
strings:
- Hello world # 不用引号包裹
- Hello
world # 拆成多行后会自动在中间添加空格
- 'Hello world' # 单引号包裹
- "Hello world" # 双引号包裹
- "world \u263A" # 使用双引号包裹时支持 Unicode 编码
- "\x0d\x0a is \r\n" # 使用双引号包裹时还支持 Hex 编码
- 'He said: "Hello!"' # 单双引号支持嵌套"

保留换行(Newlines preserved)

使用竖线符“ | ”来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留

1
2
3
4
5
6
7
8
9
10
# YAML
lines: |
我是第一行
我是第二行
我是吴彦祖
我是第四行
我是第五行

// JSON
"lines": "我是第一行\n我是第二行\n 我是吴彦祖\n 我是第四行\n我是第五行"

折叠换行(Newlines folded)

使用右尖括号“ > ”来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格

1
2
3
4
5
6
# YAML
lines: >
我是第一行
我也是第一行
我仍是第一行
我依旧是第一行

布尔值

true false
Ture False
TRUE FALSE
yes no
Yes No
YES NO

另外还支持的标量有整数,浮点数,时间戳。

引用与合并

引用

& 锚点和 ***** 别名,可以用来引用:

1
2
3
4
5
6
# 设置afu为daokun的别称
daokun: &afu # 设置锚点
age: 22
gender: male
work: 运维
your_baby: *afu # 引用锚点

image-20240515155713982

合并

配合合并标签“<<”使用可以与任意数据进行合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
daokun: &afu # 添加名为 base 的锚点
age: 22
gender: male
work: 运维

# 添加阿乐的信息
ale:
<<: *afu # 引用 afu 锚点,实例化时会自动展开
skill: play with piake # 添加额外的属性
piaoke:
<<: *afu # 引用 afu 锚点,实例化时会自动展开
gender: 人妖 # 覆写 afu 中的属性
work: 无业游民
skill: play csgo # 添加额外的属性

image-20240515160404693

在线编辑器:YAML、YML在线编辑器(格式化校验)-BeJSON.com

参考文章和视频:

  1. 一文看懂 YAML - 知乎 (zhihu.com)
  2. YAML 入门教程 | 菜鸟教程 (runoob.com)
  3. Yaml Tutorial | Learn YAML in 18 mins (youtube.com)