YAML 要点速记
一、前言
笔者最近一直在用docker compose 部署一些开源项目,配置文件用的是yml的语法;前两天接触到CNB.cool(云原生构建),其配置文件也用yml的语法,所以稍微学习下yml的语法,总结如下。
二、文章大纲
本文大纲如下:

三、概念
YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
以上描述来自于百度百科YAML[1]。
四、核心
- • 以数据为中心
- • 以空格、换行组织数据
- • 包含三种数据结构:数组、对象、纯量
五、语法要点
- 大小写敏感;
- 使用缩进表示层级关系,缩进不允许使用tab,只能使用空格;
- 空格数量不重要,只要相同层级的元素,缩进相同即可(即左端对齐);
- 使用#表示注释
- 冒号:后跟一个空格,才能跟属性值;
- 字符串可以不用引号。
六、数据结构示例
对象
- 对象键值使用冒号结构表示 key: value 冒号后面要加一个空格
- 还可以使用缩进表示层级关系。
# 简单对象
id: 1
# 嵌套对象
version:
major: 1
patch: 0
# 也可以使用行内表示法,类似json语法,注意冒号后面要加一个空格
name: {first: Jon, last: Snow}
转换成json如下:
{
"id": 1,
"version": {
"major": 1,
"patch": 0
},
"name": {
"first": "Jon",
"last": "Snow"
}
}

较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:
?
- key1
- key2
:
- val1
- val2
数组
以 - 开头的行表示构成一个数组:
# 简单数组
- item1
- item2
- item3
# 嵌套数组
-
- item1
- item2
- item3
-
- item4
- item5
- item6
# 数组嵌套对象
peoples:
-
name: Jon
age: 18
-
name: Snow
age: 20
# 也可以用行内表示,类似json语法,
array: [item1, item2, item3]
转化成json如下:
{
"peoples": [
{
"name": "Jon",
"age": 18
},
{
"name": "Snow",
"age": 20
}
],
"array": [
"item1",
"item2",
"item3"
]
}

纯量
纯量包括字符串、布尔值、整数、浮点数、null、日期、时间。
string:
- "hello world" # 字符串如包含特殊符号可以使用引号括起来
- 你好,世界
- line1
line2
boolean:
- true
- False # 布尔值大小写这几种写法都可以
- TRUE
int:
- 1
- 0b10 # 二进制
float:
- 1.0
- 1.123456e+3 # 科学计数法
null:
node: ~ #使用~表示null
date: 2020-01-01 #日期必须使用ISO 8601格式,即yyyy-MM-dd
time: 2020-01-01T12:00:00+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
引用
&可以标记一个锚点,然后通过*引用锚点;<< 可以将锚点中的内容合并到当前对象中。
defaults: &defaults
name: l
id: 1
env:
<<: *defaults
port: 8080
pro:
- &i1 1
- 2
- *i1

生成的json如下:
{
"defaults" : {
"name" : "l",
"id" : 1
},
"env" : {
"name" : "l",
"id" : 1,
"port" : 8080
},
"pro" : [ 1, 2, 1 ]
}
引用链接
[1] YAML: baike.baidu.com/item/YAML/1…