yaml

YAML 简介

发音 ‘jæməl’ 是一种表达数据结构的语言,可以配合目前大部分的语言进行使用,不同于 xml 用嵌套的方式和
json 用{}大括号[]方括号的方式,采用类似 python 的空格缩进方式,是一种极简的方式进行描述数据结构,可以用
.yaml 或 .yml 进行结尾。

yaml 官方网站
yaml 语法在线校验1
yaml 语法在线校验2

官方有提供 java 的库 snakeyaml 来操作 .yml 文件的读取和写入.

基本语法

  • 大小写敏感
  • 使用缩进表示层级关系,缩进的空格数不重要,只要相同层级的元素能够对齐就行
  • 不要使用 Tab 代替空格,因为在不同的操作系统 Tab 表示的空格个数不能,导致层次混乱
  • /# 开头的是注释

数据结构

对象

表示以键值对(key: value)形式出现的数据, 使用“冒号+空格”来分开键与值
如果省略冒号(:)后面的空格 key:value 表示的是一个字符串 “key:value”,空格的数量没有限制,默认一个空格就好

1
key: value

多层嵌套(用缩进表示层级关系)

1
2
3
key:
child-key1: value1
child-key2: value2

相应的 json

1
2
3
4
5
6
{
"key": {
"child-key1": "value1",
"child-key2": "value2"
}
}

如果没有使用缩进代表层级关系,如下的数据转换成 json 是
{“key”: null,”child-key1”: “value1”,”child-key2”: “value2”}

1
2
3
key:
child-key1: value1
child-key2: value2

或用流式风格( Flow style)的语法(用花括号包裹,用逗号加空格分隔,类似 JSON)
但是在冒号(:)后要有空格分隔

1
key: { child-key1: value1, child-key2: value2 }

数组

一组以区块格式(Block Format)(破折号(-)+空格)开头的数据组成一个数组
空格不能省略,空格数量没有限制,默认一个. 破折号可以和 key 对齐,默认缩进破折号.
同一级的破折号要对齐.

1
2
3
4
values:
- value1
- value2
- value3

如下省略空格,数据会被转换为{“values”: “-value1 -value2 -value3”}

1
2
3
4
values:
-value1
-value2
-value3

或 内联格式(Inline Format)来表达(用方括号包裹分隔)

1
values: [value1,value2,value3]

支持多维数组(用缩进表示层级关系)

1
2
3
4
5
6
7
8
values:
-
- value1
- value2
-
- value3
- value4

或内联格式(Inline Format)来表达(用方括号包裹,逗号加空格分隔)

1
values: [[value1,value2],[value3,value4]]

字面量

纯量是最基本的、不可再分的值。以下数据类型都属于 JavaScript 的纯量

布尔值(Boolean)

  • true、True、TRUE、yes、Yes和 YES 皆为真
  • false、False、FALSE、no、No 和 NO 皆为假

整数或浮点数表示

1
2
3
4
5
int:
- 2
float:
- 3.14
- 6.8523015e+5 # 使用科学计数法

空(Null)

null、Null 和 ~ 都是空,不指定值默认也是空

字符串

字符串默认不使用引号表示

如果字符串之中包含空格或特殊字符,需要放在引号之中。

1
str: '内容: 字符串'

单双引号的区别

  • 单引号,则会转义特殊字符,会把特殊字符转义后作为字符输出

    a \\n b

    1
    name: 'a \n b'
  • 双引号,则不会转义特殊字符,特殊字符会输出为其本身想表达的转义含义

    a \n b

    1
    name: "a \n b"

数据重用与合并

数据重用

为了保持内容的简洁,避免过多重复的定义,YAML 提供了由锚点标签“&”和引用标签“*”组成的语法,利用这套语法可以快速引用相同的一些数据

1
2
3
4
5
a: &anchor # 设置锚点
one: 1
two: 2
three: 3
b: *anchor # 引用锚点,数据的重用

转换为json

1
2
3
4
5
6
7
8
9
10
"a": {
"one": 1,
"two": 2,
"three": 3
},
"b": {
"one": 1,
"two": 2,
"three": 3
}

数据合并

1
2
3
4
5
6
human: &base # 添加名为 base 的锚点
body: 1
hair: 999
singer:
<<: *base # 引用 base 锚点,进行数据的合并
skill: sing # 添加额外的属性

数据类型转换

yaml 允许使用两个感叹号,强制转换数据类型.

1
2
a: !!str 123
b: !!str true

转换后的 json

1
2
3
4
{
"a": "123",
"b": "true"
}

注意事项

重复定义的key 后面的会覆盖前面的

1
2
a: b
a: c

转换为json

1
2
3
{
"a": "c"
}