YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、邮箱的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。-- 维基百科
上面我们也看到了YAML Ain't a Markup Language,这个让我想起了,GNU对UNIX来说不,YAML是对XML说不,所以YAML应该是试图用一种比XML更敏捷的方式,来完成XML所完成的任务,在我们编程过程中很多时候会用到YAML文件编写配置文件,如果使用java的话可能用的比较多的是properties的配置文件居多,但是很多时候也会用到YAML文件,比如我经常使用的HEXO,修改比较多的就是YAML文件。
YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态,下面主要针对于YAML文件相关语法做简要的记录,我平时用的比较多的是JAVA,所以针对于java也有很多YAML的实现,如果按照语法来说的话YAML文件几乎可以总结成:
Structure通过空格来展示。Sequence里的项用"-"来代表,Map里的键值对用":"分隔.
Structure通过空格来展示,可以组合成javabean这种对象,Sequence可以实现Arrays等,:分割实现对象、Map类的数据结构,外加其他的数据类型,可以涵盖所有的我们常用的数据类型。
YAML大小写敏感;
使用缩进代表层级关系;
缩进只能使用空格,不能使用TAB,不要求空格个数,只需要相同层级左对齐(一般2个或4个空格)
使用#注释
1. 对象数据类型
使用冒号,冒号后面跟一个空格,缩紧表示层级关系
keyFirst: value
key:
key1: value1
key2:value2
还可以支持行内语法表示对象:
key: {key1: value, key2: value2}
2. 数组
使用一个短横线加一个空格代表一个数组项:
- value1
- value2
- value3
数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。
-
- value1
- valu2
- value3
#如果上面作为作为value的话就是:
key:
-
- value1
- valu2
- value3
数组也同样可以使用行内:
key: [value1, value2]
举一个复杂的例子:
key:
-
key1: value
key2: value
key3: value
-
key4: value
key5: value
key6: value
上面这种写法也是可以的,可以对应的是一个list的value,list中包含两个map对象;
3. 单一常量
YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间,常量是最基本的、不可再分的值。
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 你好
- 'Hello' #可以使用双引号或者单引号包裹特殊字符
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
4. 其他
(1)引用
使用锚点:&
别名:*
重复的内容在YAML中可以使用&来完成锚点定义,使用*来完成锚点引用,例如:
key:
- value1
- &mark1 value2
key2:
- *mark1
- value3
上面中使用*mark1相当于替代了value2,那么key2的第一个元素应该是value2;
还可以:定义复杂的:
key1: &mark2
- value3
- value4
key2: *mark2
上面的*mark2相当于定义了key1中的数组内容,但要注意的是需要和key2写在一行
还有不能单独定义锚点,如:&mark value1,这种形式是不可以的
补充:
和锚点配合使用的还可能是合并内容,例如:
key1:
- &mark1 { key2: value2, key3: value3 }
key11:
<<: *mark1
key4: value4
那么上面通过 <<: *mark1 这种方式就将key11变成了:
key11:
key2: value2
key3: value3
key4: value4
通过合并内容可以有效的共用相同的配置。
(2)三个短横线
YAML文件中,可以使用--- 表示文档的开始,Springboot中profile的定义就是如此,可以一个YAML文件中,包含多个profile,每个---都是一个profile的开始,例如:
server:
address: 192.168.1.100
---
spring:
profiles: development
server:
address: 127.0.0.1
---
spring:
profiles: production
server:
address: 192.168.1.120
...和---配合使用来表示配置文件中一个文件的结束
(3)类型转换
!! 表示强制的类型转换:
string:
- !!str 54321
折叠换行与保留换行
在字符串中折叠换行,| 保留换行符
例如:
key1: >
1 2 3
4 5 6
key2: |
7 8 9
10 11 12
那么key1=1 2 3 4 5 6,就是没有保留换行符,将黄换行符转换成了空格;
而key2
key2=7 8 9
10 11 12
key2 保留的换行符。
(4)注释
使用"#"来表示注释