简介
关于
YAML是一种数据序列化语言,可用于存储和传输数据,常用于编写配置文件、数据文件、日志文件,以及跨语言进行数据共享等环境,大多数编程语言都可以使用 YAML 进行数据序列化。
YAML文件后缀为.yml或.yaml
基本语法
1. 通常使用键值对形式
- 键与值通常不需要引号包裹 (这点与json不同)
- 值可以为:数组、对象、标量值
- 标量值是指:整数、浮点数、字符串、布尔值、Null、时间、日期
2. 通过缩进或者样式流表示数据结构
- 数据可以通过空格缩进来表示层级关系,但不能用制表符(Tab)
- 子结构相较父结构必须缩进至少一个空格,同一级数据须缩进相同空格数,即左端对齐
- 也可以使用花括号{ },中括号[ ]等样式流表示层级关系
3. 大小写敏感
4. 使用#号注释
对象
最为常用的数据类型,又称为字典、哈希、映射,以 key: value 键值对的形式存储数据,key: 后需要有空格!
对象写法
name: JayChou
album: 十一月的萧邦
或者使用样式流:
{
name: JayChou,
album: 十一月的萧邦
}
等同于json格式下的
{
"name": "JayChou",
"album": "十一月的萧邦"
}
缩进与嵌套
可以通过缩进至少一个空格表示层级关系,从而嵌套其他对象、数组等
student:
name: aaa
age: 16
hobby:
- basketball
- swimming
多级嵌套时,每层嵌套都应当缩进,
且每个子元素左边应该缩进相等的空格数,即左端对齐
使用样式流:
student: {
name: aaa,
age: 16,
hobby: [ basketball , swimming ]
}
复杂对象格式
使用?加空格可以指定多个key值,使用:加空格指定多个value
?
- key1
- key2
:
- value1
- value2
表示key是一个数组,值也是一个数组,样式流:
key1,key2: ["value1","value2"]
数组
使用-开头表示数组元素
数组写法
- value1
- value2
- value3
样式流:
[value1,value2,value3]
缩进与嵌套
可以通过缩进表示层级关系,来嵌套数组、对象等
- name: 周杰伦,
age: 42,
songs:
- 夜曲
- 米兰的小铁匠
- name: 林肯公园,
age: 41,
songs:
- In the End
- Numb
样式流
[
{
name: 周杰伦,
age: 42,
songs: [ 夜曲 , 米兰的小铁匠 ]
},
{
name: 林肯公园,
age: 41,
songs: [ In the End , Numb ]
}
]
标量
标量指最基本的,不可再分的值,这里指:整数、浮点数、字符串、布尔值、Null、时间、日期
基本使用方法:
1. 整数可以为非十进制数
num1: 120 #普通十进制数
num2: 0b10_1011 #二进制以0b开头
num3: 07100 #八进制以0开头
num4: 0xf1ab #十六进制以0x开头
2. 浮点数可以使用科学计数法
float1: 3.14
float2: 3.1415926e+5 #科学计数法314159.26
float3: -.inf #负无穷大
flota4: .nan #不是数字
3. 布尔值大小写均可
bool: true
值为:true、True、TRUE均可,但TRUe将被解析为字符串
4. Null可用~表示
data: ~
5. 日期必须使用ISO 8601格式,即yyyy-MM-dd
date: 2021-07-15
6. 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
time: 2021-07-15T00:42:31+08:00
在JavaScript中解析为Thu Jul 15 2021 00:42:31 GMT+0800 (中国标准时间)
7. 使用!!数据类型 值进行类型转换
date: !!str 2021-01-15
字符串处理
一般情况下,字符串不需要添加引号,但如果字符串中间包含特殊字符,尤其是冒号加空格组合时,为了避免被yaml解析为键值对,需要添加引号
str: 'said: meet you like wind'
给数值等标量添加引号将解析为字符串
str: '99.99'
多行字符串,第二行开始所有行需要缩进至少一个空格,但解析时将被解析为一行字符串,且换行符会被替换为空格
str: aaaa
bbbb
cccc
将被解析为
str: "aaaa bbbb cccc"
单引号与双引号
单引号和双引号均可以用于包裹字符串
- 单引号会原样输出,将转义字符作为普通字符串输出
- 双引号会转义字符串,如将 \n 转义为换行
如:
content: '不会\n换行'
内容输出为:
不会\n换行
content: "进行\n换行"
内容输出为:
进行
换行
区块字符串处理
多行字符串可以使用|保留所有换行符,内容从第二行开始需要缩进至少一个空格,且最后一行的换行符也会保留。
lyrics: |
aaaa
bbbb
cccc
dddd
输出为:
aaaa
bbbb
cccc
dddd
可以使用>去除换行,换行符将被空格代替 (如果某一行是空行,该空行会被额外保留)
lyrics: >
aaaa
bbbb
cccc
dddd
输出为:
aaaa bbbb cccc dddd
可以使用+保留文字块末尾的换行
lyrics: |+
aaaa
bbbb
cccc
dddd
输出为:
aaaa
bbbb
cccc
dddd
可以使用-去除文字块末尾的换行
lyrics: |-
aaaa
bbbb
cccc
dddd
输出为:
aaaa
bbbb
cccc
dddd
在yml文件中配置好字符串格式后,读取到html中时往往需要添加如
white-space: pre-line;等css属性来保留换行符和空格,否则读入的数据可能会被css默认样式去除换行符,从而无法展示原生yml指定的数据格式
在样式流中,无法使用 | > + -
如:以上数据写为样式流
{
lyrics: |-
aaaa
bbbb
cccc
dddd
}
|- 将无法解析,抛出错误
添加HTML标签
yaml允许在值中添加HTML标签,并且标签会被正确地解析为DOM
- tag: web
content: 推荐网站<a href='SHIWIVI'>SHIWIVI</a>
或
- tag: web
content: |-
推荐
网站<a href='SHIWIVI'>SHIWIVI</a>
解析为:
使用时需要注意,插入的HTML标签是否会被其他语言解析为字符串,但yaml本身是可以输出为DOM元素的
锚点与引用
可以使用&定义一个锚点,然后使用*引用锚点
first: &anchor #定义锚点
- aaa
- bbb
second: *anchor #调用锚点
解析为
first: [aaaaa,bbb]
second: [aaaaa,bbb]
如果将多个键值对引用到其他地方,可以使用<<合并数据
first: &data #定义锚点
name: lol
age: 18
hobby:
- sing
- swing
second:
<<: *data #将数据插入此处
address: zzz
解析为:
{
"first": {
"name": "lol",
"age": 18,
"hobby": "sing swimming"
},
"second": {
"name": "lol",
"age": 18,
"hobby": "sing swimming",
"address": "zzz"
}
}
如果多次定义了同名的锚点(重定义),则先定义的锚点会被覆盖
文件格式
一个完整的yml文档以---标识文档开始,以…标识文档结束,该标识非必须,无标识的称为裸文档,文件开头可以添加%YAML来识别文件的YAML版本
%YAML 1.2
# 开头注释,注明文档作者等信息
---
ip: 45.77.77.49
port: 443
...
一个yml文件中可能有多个文档
---
ip: 45.77.77.10
port: 80
...
---
ip: 45.77.77.11
port: 443
...
但如果在一个yml文件中写入多个文档,在某些环境下读入可能报错,需要分割为多个文件
err: YAMLException: expected a single document in the stream, but found more