YAML使用

时间:2024-04-10 15:15:26

1 YAML简介

1.1 YAML是什么

YMAL (YAML Ain’t a Markup Language),即YAML是一种非标记语言。

1.2 YAML优点

相比xml和properties利用空白缩进分行,显示了数据的结构性,简化了书写格式,降低了复杂度,提升易读性。

2 YAML基本语法规则

  1. 大小写敏感;
  2. 使用缩进表示层级关系;
  3. 禁止使用Tab缩进,只允许使用空格,空格多少无限制,只需要保证同一层级左对齐即可,多为2两个和四个;
  4. 使用#注释,且只存在行注释;
  5. 字符串无需引号标注;

3 YAML中组织结构

单个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}

5 YAML学习资源

YAML 1.2
YAML from Wikipedia
snakeyaml for Java