概述
YAML 是一个人类可读的数据序列化语言。
常用于配置文件。
YAML 使用 Unicode 编码作为字符标准编码,如 UTF-8。
与其他语言的关系
- YAML 1.2 是 JSON 的超集。
- 使用 Python 风格的缩进表示嵌套。
- 数据类型基于 Perl。
- 以
:
为中心键值对语法来源于电子邮件头(RFC 0822)。 - 文档分隔符
---
借鉴自 MIME(RFC2045)。 - 转义序列重用 C 的。
- 多行字符串空白包装(whitespace wrapping)继承自 HTML。
- 预期在流(stream)中读写,源自 SAX。
支持情况
- 能被几乎所有的主流语言读写。
- 许多编辑器或 IDE 都提供支持。
语法
空白缩进代表结构,使用空格(通常 2 或 4 个)缩进,而不使用 Tab。
注释(只有行注释)以
#
开始,且#
之前至少要有一个空白字符。:
后有一空格。列表项用
-
列出,或者列表用流式(flow)语法[]
列出并用,
分隔。映射项用
:
列出,或者映射用流式语法{}
列出并用,
分隔。如果键有?
前缀,则可以是复杂类型。1
2
3
4
5
6
7
8
9# 流式语法
key: { child-key: value, child-key2: value2 }
# 复杂键
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2字符串可以直接原样使用(不用引号),也可以使用双引号和单引号,双引号支持转义。
块标量(block scalar)以缩进定界,使用
|
保留或>
折叠换行。多文档流使用
---
(三个连字符)开始一个文档,并使用可选的...
(三个句点)结束一个文档。使用
&
定义一个锚,并使用*
引用它。节点可
!!
后跟类型指定数据类型或!
后跟标签(tag)标记。文档前可能有指令,YAML 1.1 定义了两个指令:
%YAML
(指定版本),%TAG
(URI 前缀缩写)。
基本组件
数据结构
1 | # 序列(block sequence) |
文本
1 | # 多行文本 |
文档结构
1 | --- # 文档开始 |
锚点引用
1 | name: &key Eric # 定义锚点 |
高级特性
引用修改
1 | - step: &id001 # 定义锚点 id001 |
数据类型
数据类型分为三类:核心类(core)、定义类(defined)、用户定义类(user-defined)。
核心类是所有解析器都要实现的,比如:float、int、string、list、map……
定义类是高级数据类型,不一定所有解析器都会实现,比如:binary。
用户定义类是用户自行扩展的数据类型,可以是类(class)、结构(structure)、原始类型(primitive)。
下面是常见的内置类型:
内置类型 | 说明 |
---|---|
int | 整型 |
float | 浮点型 |
bool | 布尔型 |
str | 字符串 |
binary | 二进制 |
timestamp | 日期时间类型 |
null | 空值 |
set | 集合 |
seq | 序列,列表 |
map | 映射 |
omap | 键值列表 |
pairs | 对象列表 |
YAML 能自动识别数据类型,通常不需要明确指定。
1 | int: 0b1010_0101 # 二进制表示 |
但如果不想某个数据因为格式被误认为某种类型,可以明确指定数据类型。
使用“!”指定数据类型,单叹号表示自定义类型,双叹号表示内置类型。
1 | isString: !!str 2018-07-30 # 强调是字符串不是日期数据 |