文章目录
随着软件开发的需要,接触到了许多的配置文件都乐意使用YAML文件来做配置文件,为了工作需要,学习和了解YAML的语法是非常必要。 YAML是一种数据序列化语言,有些类是于JSON,因为这种语言对格式要求严格,又是以数据本身为中心的语言,所以很适合做配置文件。文件后缀名以 .yaml 和 .yml 为后缀名。这里将对这种语法进行简单的介绍。
这里使用JSON来说明YAML的含义
使用工具是YAML和JSON互转的工具(网站链接)
注意:
- YAML区分大小写。
- YAML在创建YAML文件时不允许使用制表符,只允许使用空格。
- YAML同级排首对齐(一般2/4个空格)
- YAML键值以冒号+空格分开(例如:key: value)
一、缩进和注释
对于缩进,YAML只有三点要求:
1、只能使用空格
2、同级排首对齐
3、键值以冒号+空格分开
注释使用#进行单行注释,YAML不支持多行注释
例如:
YAML:
#正规格式
a: b
c:
- c1
- c2
d:
key1: value1
key2: value2
---
#值格式错位,但是格式满足要求依然正确
c:
- c1
- c2
d:
key1: value1
key2: value2
JSON:
//正规格式
{
"a": "b",
"c": [
"c1",
"c2"
],
"d": {
"key1": "value1",
"key2": "value2"
}
}
//值格式错位,但是格式满足要求依然正确
{
"c": [
"c1",
"c2"
],
"d": {
"key1": "value1",
"key2": "value2"
}
}
二、键值对、对象、map、list
YMAL:
a: value1 #键值对
b: #对象
name: Name
age: 12
map: #map
key1: value1
key2: value2
list: #简单数组
- 12
- 13
- 14
objectlist: #对象数组
-
name: name1
age: 12
-
name: name2
age: 13
? #复杂对象,表示key是一个数组,值也是数组,当然对象也可以
- key1
- key2
:
- value1
- value2
JSON:
{
"a": "value1",
"b": {
"name": "Name",
"age": 12
},
"map": {
"key1": "value1",
"key2": "value2"
},
"list": [
12,
13,
14
],
"objectlist": [
{
"name": "name1",
"age": 12
},
{
"name": "name2",
"age": 13
}
],
"[\"key1\", \"key2\"]": [
"value1",
"value2"
]
}
YAML中还支持流式(flow)语法表示对象,比如上面例子可以写为:
a: value1 #键值对
b: {name: Name,age: 12} #对象
map: {key1: value1,key2: value2} #map
list: [12,13,14] #简单数组
objectlist: [{name: name1,age: 12},{name: name2,age: 13}] #对象数组
[key1,key2] : [value1,value2] #复杂对象,表示key是一个数组,值也是数组,当然对象也可以
JSON:
{
"a": "value1",
"b": {
"name": "Name",
"age": 12
},
"map": {
"key1": "value1",
"key2": "value2"
},
"list": [
12,
13,
14
],
"objectlist": [
{
"name": "name1",
"age": 12
},
{
"name": "name2",
"age": 13
}
],
"[\"key1\", \"key2\"]": [
"value1",
"value2"
]
}
三、基本常量的表示方法
在YAML语法中如何表示基本常量呢,下面举例说明
# 整数
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
canonical: 12345
decimal: +12,345
sexagecimal: 3:25:45
octal: 014
hexadecimal: 0xC
#浮点数
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
canonical: 1.23015e+3
exponential: 12.3015e+02
sexagecimal: 20:30.15
fixed: 1,230.15
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
nullObj:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- Hello world
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2019-11-16 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2019-11-16T05:42:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
JSON
{
"int": [
123,
685230
],
"canonical": 1230.15,
"decimal": 12345,
"sexagecimal": 73809.0,
"octal": 12,
"hexadecimal": 12,
"float": [
3.14,
685230.15
],
"exponential": 1230.15,
"fixed": 1230.15,
"boolean": [
true,
false
],
"nullObj": {
"nodeName": "node",
"parent": null
},
"string": [
"Hello world",
"Hello world",
"newline newline2"
],
"date": [
"2019-11-16"
],
"datetime": [
"2019-11-15 16:42:31 -0500"
]
}
四、特殊符号
1、— 和 …
在YAML里 — 和 …表示文档的开始和结束,相当于一个文件可以当作多个文件使用
server:
port: 8080
spring:
profiles:
active: dev
---
server:
port: 8081
spring:
profiles: dev
...
---
server:
port: 8082
spring:
profiles: prod
...
一般情况下…可以省略
server:
port: 8080
spring:
profiles:
active: dev
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: prod
记住要用…必须是 — 开头, … 结尾,不能反了使用。
2、"" 和 ''的使用
这个在字符串中使用是有区别的;
双引号会对字符传中的特殊字符进行转译,但是单引号不会
YMAL
DoubleQuotes: "双引号\n"
Apostrophe: '单引号\n'
JSON
{
"DoubleQuotes": "双引号\n",
"Apostrophe": "单引号\\n"
}
3、!!
在YAML中 !! 表示强制转换
YAML
number1: 1234
number2: !!str 1234
JSON
{
"number1": 1234,
"number2": "1234"
}
4、> 和 |
符号 > 表示字符串折叠,下面同级的字符串其实表示一行,保留一个字符串
符号 | 表示字符串换行,每行字符串都保留了一个换行符
YAML
string1: >
第一行
第二行
string2: |
第一行
第二行
#这一行是为了添加一个换行符
JSON
{
"string1": "第一行 第二行\n",
"string2": "第一行\n第二行\n"
}
5、&、* 和 << 符号的使用
& 表示锚点
* 表示引入
<< 表示合并
YAML
AnchorPoint: &AP {X: 1,Y: 2,Z: 3} #设置锚点,类似于 AP=AnchorPoint
example:
a: 1
Introduce: *AP #引入锚点,类似于 Introduce=AP
<<: *AP #合并锚点,类似于 example.push(AP)
JSON
{
"AnchorPoint": {
"X": 1,
"Y": 2,
"Z": 3
},
"example": {
"a": 1,
"Introduce": {
"X": 1,
"Y": 2,
"Z": 3
},
"X": 1,
"Y": 2,
"Z": 3
}
}
以上就介绍完了YAML的基本语法了,这些基本足够开发过程中使用了,只有配置中的其他操作,可能需要依托平台提供的工具才能使用,这里就不介绍了。