本文介绍的是YAML的语法内容,在编写docker-compose配置文件的时候使用到,这里做一些整理汇总
本文中的所有案例,都可以在 yamlTojson,js-yaml demo 上进行过测试验证。
YAML语法
---
放在文件的开头,表示YAML文件的开始
...
放在文件的结尾,表示YAML文件的结束
基本语法特点
- 大小写敏感
- 通过缩进表示层级关系
- 禁止使用tab缩进,只能使用空格键
- 使用
#
表示注释
引号
双引号 ""
,不会转移字符串里面的特殊字符,特殊字符作为本身想表达的意思,例如如下的
# yaml内容
comment: "my name is\njs."
# json内容
{
"comment": "my name is\njs."
}
单引号 ''
,将会转移特殊字符,当成字符串处理
# yaml内容
comment: 'my name is\njs.'
# 或者不使用单引号,结果也相同
comment: my name is\njs.
# json内容
{
"comment": "my name is\\njs."
}
文本块
|
标记的文本内容缩进表示的快,可以保留块中已有的回车换行,例如如下内容
# yaml内容
comment_1: |
my name is\njs.
comment_2: |+
my name is\njs.
comment_3: |-
my name is\njs.
over: true
# json内容
{
"comment_1": "my name is\\njs.\n",
"comment_2": "my name is\\njs.\n",
"comment_3": "my name is\\njs.",
"over": true
}
总结一下就是:
-
|
会保留块中已有的回车换行; -
|+
表示保留文本块末尾的换行; -
|-
表示删除字符串末尾的换行; -
|
/|+
/|-
三者与后面的字符串必须另起一行。
>
标记的文本内容缩进表示的块,将块中回车替换为空格(但是字符串最开始和最末尾如果有回车的话,将不会替换为空格,保留的依然是回车,并且两个回车会作为一个回车来表示),例如
# yaml内容
comment_1: >
hello.
my name is \njs.
goodbye.
# json内容
{
"comment_1": "\nhello. my name is \\njs.\ngoodbye.\n"
}
列表
列表中的所有成员都开始于相同的缩进级别,最好不适用 tab,而是使用 space(空格) 来表示,并且使用一个 -
作为开头(一个横杆和一个空格)
例如如下的yaml内容和对应的json内容:
# yaml内容
country:
- China
- America
# json内容
{
"country": [
"China",
"America"
]
}
纯量、数据类型约定
纯量是最基本的,不可再分的值
- 字符串: 使用
""
/''
/ 不使用引号 - 布尔值: 使用
true
/false
- 数字: 使用
12
/12.1
等 - 空值: 使用
null
/~
/.inf
- 日期: 日期采用复合ISO8601格式的年月日表示,例如
date: 2018-05-20
- 时间: 时间采用ISO8601格式,例如
datetime: 2018-05-20t12:00:00-05:00
布尔值
为了使用布尔值,可以通过如下的方式来定义指定,并且如果该布尔值的key出现了多次的话,后面的内容会忽略(注意不是覆盖),所以 is_male 的值为 true 布尔值:
is_male: true
is_male: True
is_male: TRUE
is_male: false
is_male: FALSE
格式强制转换
yaml支持变量类型的强制转换,使用两个感叹号来表示,支持强制转换的类型有:
-
!!str
表示强制转换为字符串 -
!!int
表示强制转换为整型 -
!!float
表示强制转换为浮点类型 -
!!bool
表示强制转换为布尔类型 -
!!null
空值 -
!!set
集合 -
!!omap
/!!pairs
键值列表 / 对象列表 !!seq
例如如下例子:
# yaml内容
info: !!str true
# json内容
{
"info": "true"
}
!!omap
使用 !!omap
表示生成一个键值列表,即得到的是一个列表,然后列表中的元素是字典,例如:
# yaml内容
info: !!omap
- name1: js
- name2: st
- name3: ob
# json内容
{
"info": [
{
"name1": "js"
},
{
"name2": "st"
},
{
"name3": "ob"
}
]
}
引用
&
用来建立锚点,并指定锚点的名字,例如 ¶meter
<<
表示合并到当前数据,例如 <<: *parameter
*
用来引用锚点,例如 *parameter
例如如下的例子
# yaml内容
defaults: &user_info
name: js
age: 12
info:
has_more: true
<<: *user_info
# json内容
{
"defaults": {
"name": "js",
"age": 12
},
"info": {
"has_more": true,
"name": "js",
"age": 12
}
}
另外 <<
合并的功能,如果有多个锚点在一起合并被引用的时候,是最先引用的变量会覆盖后引用的变量,例如如下例子,最后 r 的值等于 10
# yaml内容
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }
- # Override
<< : [ *BIG, *LEFT, *SMALL ]
x: 1
label: center/big
# json内容
[
{
"x": 0,
"y": 2
},
{
"r": 10
},
{
"r": 1
},
{
"r": 10,
"x": 1,
"y": 2,
"label": "center/big"
}
]