YAML配置文件语法+缩进示例
YAML(Yet Another Markup Language)另一种标记语言。
YAML 是一种较为人性化的数据序列化语言,可以配合目前大多数编程语言使用。YAML 的语法比较简洁直观,特点是使用空格来表达层次结构,其最大优势在于数据结构方面的表达,所以 YAML 更多应用于编写配置文件,其文件一般以 .yml 为后缀。
特点:
- 易于阅读:YAML 使用缩进和比较简洁的语法来表示数据结构,使得它比许多其他数据格式更容易阅读和理解。
- 数据结构友好:YAML 天然支持标量(如字符串、整数、浮点数)、列表(数组)和映射(字典)等数据结构。
- 无类型标签:YAML 通过上下文来推断值的类型,不需要显式的类型标签。
- 可交互:YAML 可以在不同的编程语言之间进行交互,因为它有广泛的语言支持。
- 表达能力强:YAML 可以表示复杂的数据结构,并且可以通过锚点和别名来重用数据。
- 可伸缩性:YAML 可以很容易地扩展到新的数据类型,而不需要改变现有的解析器。
YAML 的使用场景包括但不限于:应用程序的配置、数据交换格式、文档撰写、自动化脚本、云计算和服务编排等等。
1.1 基本语法
- 大小写敏感。
- 使用缩进表示层级关系。
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
# YAML
one:
two: 2
three:
four: 4
five: 5
// 转成 JSON 后的格式
"one": {
"two": 2,
"three": {
"four": 4,
"five": 5
}
}
- 用 # 标识注释,且只能单行
|
# 我是一行注释 |
|
# 我是另一行注释 |
- 一个 YAML 文件可以包含多个文档
每个文档均以“---”三个横杠开始,如果一个文件中仅一个文档,则可省略。
每个文档并不必须使用结束符“...”来表示结束,但是对于网络传输或者流来说,作为明确结束的符号,有利于软件处理。(例如,不需要知道流关闭就能知道文档结束)
---
# 这是第一份文档内容
one: 1
# 其他内容...
...
---
# 这是第二份文档内容
two: 2
# 其他内容...
1.2 数据结构与类型
1.2.1 对象 Mapping
标识以键值对(key: value)形式出现的数据。
- 格式
在键和值中间加入标识,冒号+空格(: )。
# YAML
key: value
// JSON
{
"key": "value"
}
- 多层嵌套数据
用缩进表示层级关系
# YAML
key:
child-key1: value1
child-key2: value2
// JSON
{
"key": {
"child-key1": "value1",
"child-key2": "value2",
}
}
- 用一对 {} 花括号包裹,表示一个键值表
键值对之间用逗号+空格(, )分隔,类似 JSON。
# YAML
key: { child-key1: value1, child-key2: value2 }
// JSON
{
"key": {
"child-key1": "value1",
"child-key2": "value2"
}
}
1.2.2 数组 Sequence
- 横线+空格(- )开头的数据组成一个数组
# YAML 区块格式(Block Format)
values:
- value1
- value2
- value3
# YAML 内联格式(Inline Format)
values: [value1, value2, value3]
1.2.3 标量 Scalars 基本数据类型-str、bool、int、float、null、datetime...
本章节包含以下部分简介:字符串 String、布尔值 boolean、整数 Integer、浮点数 Float、空 Null、日期时间 datetime、类型强制转换等。
- 字符串(string、str)
字符串是最常见,也是最复杂的一种数据类型。
字符串一般不需要用引号包裹,但是如果字符串中使用了反斜杠“\”开头的转义字符就必须使用引号包裹。
# YAML
strings:
- Hello without quote # 不用引号包裹
- Hello
world # 拆成多行后会自动在中间添加空格
- 'Hello with single quotes' # 单引号包裹
- "Hello with double quotes" # 双引号包裹
- "I am fine. \u263A" # 使用双引号包裹时支持 Unicode 编码
- "\x0d\x0a is \r\n" # 使用双引号包裹时还支持 Hex 编码
- 'He said: "Hello!"' # 单双引号支持嵌套"
- 空(Null)
# YAML
nulls:
- null
- Null
- ~
- # 未指定值
- 日期时间(date、datetime)
没有 +8 小时的标记时,默认就是协调世界时(UTC),也就是标准时间,转换成 JSON 都是按照协调世界时的格式,如下代码:
# YAML
dates:
- 2024-03-05 # 协调世界时(UTC)
- 2024-03-05T20:00:00 # 协调世界时(UTC)
- 2024-03-05T20:00:00+08:00 # +8 小时就是北京时间
- 2024-03-05T20:00:00.10+08:00
- 2024-03-05 20:00:00.10 +8