YAML语法介绍

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里的键值对用":"分隔.

  1. 抽象出来的的对象,java里面Map、Hash这种
  2. Collection相关的List、Set这种
  3. 单一的int这种

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)注释

使用"#"来表示注释

 

你可能感兴趣的:(杂谈)