文章目录
- 在线解析工具
- 1. 简介
- 2. 语法规则
- 3. 数据类型
- 3.1 数组:
- 3.2对象:
- 3.3 标量
- 3.4 复合结构
- 3.5 锚点
- 3.5.1 单个锚点
- 3.5.6 多个锚点
- 3.6 引号
- 参考
在线解析工具
工具1
工具2
1. 简介
Yaml是一种可读性高的数据标记语言,Yaml文件是一种配置文件,一般主要用于存储全局配置信息等,可存放不同类型的数据,如列表,字典等。
2. 语法规则
- 文件后缀.yml
- 大小写敏感
- 空格缩进区分层级
- 且空格数量不要求,对齐即可,但是建议2或4个,便于维护。缩进只能使用空格
不能使用TAB
- : 后面要有个
空格
,否则会把整体当个字符串
如 下图,只有 students3才顺利解析, students1和 students2 都由于空格问题,导致解析错误
- #表示注释
备注:详细用法见数据类型小节例子
3. 数据类型
- 数组:序列/列表,按次序排序的值
- 对象:映射/字典/哈希,键值对
- 标量:单个值,不可再分,如字符串,布尔值,Null等
备注:
- 冒号和‘-’后的值前面需空一个空格
- 字符串不使用引号
- 单引号转义特殊字符、空格等
数组
序列/列表,按次序排序的值
3.1 数组:
如列表numbers:[1,2,3,4,5]
# - 列表值,使用“-”表示列表中的元素
# 表示方式1:
numbers:
- 1
- 2
- 3
- 4
- 5
#表示方式2:
numbers: [1,2,3,4,5]
对象
映射/字典/哈希,键值对
3.2对象:
如字典:ab:{“a”:1,“b”:“哈哈”}
# 表示方式1
ab:
a: 1
b: 哈哈 # 字符串哈哈可不使用引号
# 表示方式2:
ab: {"a":1,"b":"哈哈"}
注意:字典 key:value形式时,key必须带引号
:
students: {“a”:1,“b”:2,c:3} 会被识别为:
students:
a: 1
b: 2
'c:3:3': null
3.3 标量
单个值,不可再分,如字符串,布尔值,Null,日期等
# 标量
# 字符串
name:susy
# 布尔值
isFlag: True
# Null:使用~表示
a: ~
# 日期:YYYY-MM-DD格式,
d: 2023-03-06
# 时间:YYYY-MM-DDThh:mm:ss+时区
t: 2018-02-17T15:02:31+08:00
# 特殊字符、空格 使用单引号转义
email: '123@qq.com'
talk: 'Hello World'
- 日期必须使用ISO 8601格式,即yyyy-MM-dd
- 可以使用双引号或者单引号包裹特殊字符或带空格的字符串
3.4 复合结构
包含数组,对象,标量等结构
复合结构:
{“code”:200,students:[{name:“张三”,age:12,hobby:[“打篮球”,“跑步”]},{name:“李四”,age:17,hobby:[“打羽毛球”,“看书”]}]}
# hobby也可以使用行内写法:
# hobby:[打篮球,跑步]
code: 200
students:
-
name: 张三
age: 12
hobby:
- 打篮球
- 跑步
-
name: 李四
age: 17
hobby:
- 打羽毛球
- 看书
引用
引用已有键的值,可使用&锚点和*别名来引用,可通俗理解为复制粘贴,可复用yaml文件中已有键值对。
3.5 锚点
3.5.1 单个锚点
引用重复的内容在YAML中可以使用&来完成锚点定义,使用*来完成锚点引用
当锚点是 标量类型是,不管是位于上层,还是某个属性,都可以用于下面的语法:
#方式一 位于属性中:在hr中,使用&SS为Sammy Sosa设置了一个锚点(引用)名称为SS,在rbi中使用*SS完成了锚点使用
hr:
- Mark McGwire
- &SS Sammy Sosa
rbi:
- *SS
- Ken Griffey
#执行结果
{rbi=[Sammy Sosa, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}
#方式2 位于上层:注意不能独立的定义锚点,比如不能直接这样写: &SS Sammy Sosa;
SS: &SS Sammy Sosa
hr:
- Mark McGwire
- *SS
rbi:
- *SS
- Ken Griffey
当 锚点引用的是对象类型时,需要结合<<: 来一起使用
# 使用&别名建立锚点,将students全部内容设别名为“stu”
students: &stu
name: zhangsan
age: 12
或
students: &stu { "name“: zhangsan , ”age“: 12 }
再来看看此时的锚点语法:
# 引用键
# 引用students的内容,使用<< *别名即可,<< 表示合并当前数据
class1:
<<: *stu
sex: man
以上内容被读取后输出为:
# 键值
students:
name: zhangsan
age: 12
# 引用键
class1:
name: zhangsan
age: 12
sex: man
本质上是合并的结果
3.5.6 多个锚点
看个复杂例子,会涉及到多个锚点的情况:
#在merge中,定义了四个锚点,分别在sample中使用。
merge:
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }
#sample1中,<<: *CENTER意思是引用{x: 1,y: 2},并且合并到sample1中,那么合并的结果为:sample1={r=10, y=2, x=1}
sample1:
<<: *CENTER
r: 10
#sample2中,<<: [*CENTER, *BIG] 意思是联合引用{x: 1,y: 2}和{r: 10},并且合并到sample2中,那么合并的结果为:sample2={other=haha, x=1, y=2, r=10}
sample2:
<< : [ *CENTER, *BIG ]
other: haha
#sample3中,引入了*CENTER, *BIG,还使用了r: 100覆盖了引入的r: 10,所以sample3值为:sample3={r=100, y=2, x=1}
sample3:
<< : [ *CENTER, *BIG ]
r: 100
主要是要你知道 :
- 多个锚点 ,需要使用 [] ,大括号本身不是啥特殊含义的东西,仅仅表示多个对象被merger而已。如果看成普通数组,就难以理解了。
- 自身属性优先级高,merge过来的同名属性优先级低
3.6 引号
引号可以对于特殊字符,是决定可视或不可视:
str1: "Hello World"
str2: "Hello\nWorld"
str3: 'Hello World'
str4: 'Hello\nWorld'
输出结果:
str1: Hello World
str2: |- #表示程序解析该段 yaml时,看到的是2行字符串
Hello
World
str3: Hello World
str4: Hello\nWorld
参考
yaml