什么是YAML


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/08/15/%E4%BB%80%E4%B9%88%E6%98%AFYAML/

摘要

本文主要讲述了:

  1. 什么是 YAML
  2. 文件扩展名
  3. 语法

正文

什么是 YAML

YAML(读音:/ˈjæməl/)常用于编写配置文件。

YAML 的初始版本发布于 2001 年 5 月 11 日。目前的最新版本是 1.2。

1.2 版本的 YAML 并不是 JSON 的严格真超集(JSON 允许使用tab作为缩进)。

文件扩展名

.yaml(官方推荐)或.yml

语法

因为所有不适用tab作为缩进的 JSON 文件都是合法的 YAML 文件。本文不再赘述 JSON 语法。

大小写敏感

版本号

%YAML指令用于标志 YAML 的版本号(可选)。

示例:

1
%YAML 1.2

文档分隔符

YAML 支持在单个文件内表示多个文件。

  • ---表示不同文件之间的分隔符
  • ...表示文件的结束(可选)

示例:

1
2
3
4
5
1
---
2
---
3

缩进

  1. 禁止使用tab作为缩进(注意:JSON允许)
  2. 缩进的数量不作限制,但下级的缩进必须比上级多,同级的缩进必须相等

行注释

示例:

1
# 我是行注释

null

1
~

数字

示例:

1
2
# 整型
1
1
2
# 浮点型
1.5
1
2
# 科学计数法
1e6
1
2
# 二进制
0b1000
1
2
# 十进制
8
1
2
# 十六进制
0xff

布尔值

  • trueTrueTRUE都为true
  • falseFalseFALSE都为false

字符串

  • 无需引号包裹
  • 使用单引号或双引号包裹

数组

注意:-之后至少需要跟一个空白字符。

一维数组:

1
2
3
- a
- b
- c

1
[a, b, c]

二维数组:

1
2
3
4
5
6
7
8
9
- - a1
- a2
- a3
- - b1
- b2
- b3
- - c1
- c2
- c3

1
2
3
- [a1, a2, a3]
- [b1, b2, b3]
- [c1, c2, c3]

对象

注意::之后至少需要跟一个空白字符。

示例:

1
2
3
a: 1
b: 2
c: 3
1
2
3
4
5
6
7
8
9
10
11
12
a:
a1: 1
a2: 2
a3: 3
b:
b1: 1
b2: 2
b3: 3
c:
c1: 1
c2: 2
c3: 3
1
2
3
a: { a1: 1, a2: 2, a3: 3 }
b: { b1: 1, b2: 2, b3: 3 }
c: { c1: 1, c2: 2, c3: 3 }

日期

YAML 的日期格式遵循ISO-8601标准。

示例:

1
2
3
# 2019-01-01T00:00:00.000Z
# 2019-01-01T08:00:00.000+0800
2019-01-01
1
2
3
# 2019-01-01T04:00:00.000Z
# 2019-01-01T12:00:00.000+0800
2019-01-01T12:00:00
1
2
3
# 2019-01-01T04:00:00.123Z
# 2019-01-01T12:00:00.123+0800
2019-01-01T12:00:00.123
1
2
3
# 2019-01-01T04:00:00.000Z
# 2019-01-01T12:00:00.000+0800
2019-01-01T12:00:00+08:00

类型强制转换

  • !!int表示转换为整型
  • !!float表示转换为浮点数
  • !!bool表示转换为布尔值
  • !!str表示转换为字符串

示例:

1
!!int '1'
1
!!float '123.456'
1
!!bool 'False'
1
!!str 123

锚点、引用与对象合并

  • &表示锚点
  • *表示引用
  • <<表示对象合并

示例:

1
2
3
4
5
foo: &demo
- 1
- 2
- 3
bar: *demo

相当于

1
2
3
4
{
"foo": [1, 2, 3],
"bar": [1, 2, 3]
}

示例:

1
2
3
4
5
6
7
8
9
foo: &demo
a: 1
b: 2
c: 3
bar:
<<: *demo
d: 4
e: 5
f: 6

相当于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"foo": {
"a": 1,
"b": 2,
"c": 3
},
"bar": {
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5,
"f": 6
}
}

特别注意:合并的对象属性可被同名属性覆盖。

示例:

1
2
3
4
5
6
7
8
9
foo: &demo
a: 1
b: 2
c: 3
bar:
<<: *demo
a: 4
b: 5
c: 6

相当于

1
2
3
4
5
6
7
8
9
10
11
12
{
"foo": {
"a": 1,
"b": 2,
"c": 3
},
"bar": {
"a": 4,
"b": 5,
"c": 6
}
}

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/08/15/%E4%BB%80%E4%B9%88%E6%98%AFYAML/


本文对你有帮助?请支持我


支付宝
微信