文章目录
1 YAML简介
1.1 YAML是什么
YMAL (YAML Ain’t a Markup Language),即YAML是一种非标记语言。
1.2 YAML优点
相比xml和properties利用空白缩进分行,显示了数据的结构性,简化了书写格式,降低了复杂度,提升易读性。
2 YAML基本语法规则
- 大小写敏感;
- 使用缩进表示层级关系;
- 禁止使用Tab缩进,只允许使用空格,空格多少无限制,只需要保证同一层级左对齐即可,多为2两个和四个;
- 使用#注释,且只存在行注释;
- 字符串无需引号标注;
3 YAML中组织结构
单个YAML 文件可以由一或多个文档组成(也即相对独立的组织结构组成),文档间使用“—”(三个横线)在每文档开始作为分隔符。同时,文档也可以使用“…”(三个点号)作为结束符(可选)。
例如:
server:
address: 192.168.1.100
---#production dev profile
spring:
profiles: development
server:
address: 127.0.0.1
--- #production yaml
spring:
profiles: production
server:
address: 192.168.1.120
#与...配合使用,相当于在一个yaml文件中配置了两个yaml配置:
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
4 YAML中基础数据格式
YAML中基础数据格式分为常量,对象和数组三种.
4.1 常量
常量又称纯量,主要是指单个不可在分割的基础单位,YAML中的常量包括整数,浮点数,字符串,NULL,日期,布尔,时间.
boolean:
- TRUE #大小写均可
- false
float:
- 3.14
- 6.8523015e+5 #支持科学计数法
int:
- 135
- 074 #支持二进制/八进制/十六进制表示,以0b开头表示二进制,0开头八进制,0x十六进制
null:
- attempNM : attemp
- attempGend: 'man' #字符串无需引号标注
- ~ #表示null.
string:
- myname
- "all the winer"
- 'all the same ' #单引号和双引号作用一样
- newline
newline2 #字符串可以换行,每次换行会转换为一个空格符号。
date:
- 2018-11-11 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00
4.2 对象
对象是指:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)。
格式:
key:value
weapon:handarm
配合缩进表示层级:
parent-key:
child-key1 : value1
child-key2 : value2
YAML中还支持流式(flow)语法表示对象,比如上面例子可以写为:
key: {child-key1: value1, child-key2: value2}
较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的key,配合一个冒号加一个空格代表一个value,表示key与value均为一个数组:
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
4.2 数组
使用一个短横线加一个空格代表一个数组项.
格式:
Lauange:
- Java
- Python
- C#
#写法二:
-
- Java
- Python
- C#
#写法三:
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
#流式写法:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
5 YAML中特殊符号
5.1 类型符
在YAML中使感叹号表示数据类型.“!”(叹号)显式指示类型,或自定义类型标识。单叹号通常是自定义类型,双叹号是内置类型
string: #指定是字符串类型.
- !!str 54321
- !!str true
--- !!set #指定为set集合类型.
- Mark McGwire: 65
- Sammy Sosa: 63
- Sammy Sosa: 63
- Ken Griffy: 58
--- !!set # 注意,“?”表示键为列表,在这里列表为 null
? Mark
? Sammy
? Key
#下面是内置类型
!!int # 整数类型
!!float # 浮点类型
!!bool # 布尔类型
!!str # 字符串类型
!!binary # 也是字符串类型
!!timestamp # 日期时间类型
!!null # 空值
!!set # 集合
!!omap, !!pairs # 键值列表或对象列表
!!seq # 序列,也是列表
!!map # 键值表
# 下面是自定义的类型或标识
%TAG ! tag:clarkevans.com,2002: # % 是指令符号
--- !shape
# Use the ! handle for presenting
# tag:clarkevans.com,2002:circle
- !circle
center: &ORIGIN {x: 73, y: 129}
radius: 7
- !line
start: *ORIGIN
finish: { x: 89, y: 102 }
- !label
start: *ORIGIN
color: 0xFFEEBB
text: Pretty vector drawing.
5.2 文本块
“>” 和 “|” 这两个符号是YAML中字符串经常使用的符号,前者其所修饰的所有字符串的换行符均不保留,后者与之相反全部保留.
accomplishment: > # 注意 ":" 与 ">" 之间的空格,另外可以使用空行来分段落
Mark set a major league
home run record in 1998.
stats: | # 注意 ":" 与 "|" 之间的空格
65 Home Runs
0.278 Batting Average
#等价于
accomplishment:
Mark set a major league home run record in 1998.
stats:
65 Home Runs
0.278 Batting Average,
5.3 锚点
在YAML中,对于重复使用的内容,我们可以通过锚点的定义与引用达到定义一次,重复使用的效果.使用$定义锚点,使用*引用锚点.
SS: &SS Sammy Sosa
hr:
- Mark McGwire
- *SS
rbi:
- *SS
- Ken Griffey
#等价于
hr:
- Mark McGwire
- &SS Sammy Sosa
rbi:
- *SS
- Ken Griffey
#等价于
hr:
- Mark McGwire
- Sammy Sosa
rbi:
- Sammy Sosa
- Ken Griffey
定义复杂锚点:
default: &default
- Mark McGwire
- Sammy Sosa
hr: *default
5.4 内容合并符
"<<"是用来合并内容的,主要是配合锚点使用.
merge:
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }
sample1:
<<: *CENTER
r: 10
# sample1={r=10, y=2, x=1}
sample2:
<< : [ *CENTER, *BIG ]
other: haha
# sample2={other=haha, x=1, y=2, r=10}
sample3:
<< : [ *CENTER, *BIG ]
r: 100
#sample3={r=100, y=2, x=1}