文章目录
- 在线解析工具
- 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: 1b: 哈哈 # 字符串哈哈可不使用引号# 表示方式2:
ab: {"a":1,"b":"哈哈"}
注意:字典 key:value形式时,key必须带引号
:
students: {“a”:1,“b”:2,c:3} 会被识别为:
students:a: 1b: 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: 12hobby:- 打篮球- 跑步-name: 李四age: 17hobby:- 打羽毛球- 看书
引用
引用已有键的值,可使用&锚点和*别名来引用,可通俗理解为复制粘贴,可复用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: &stuname: zhangsanage: 12或
students: &stu { "name“: zhangsan , ”age“: 12 }
再来看看此时的锚点语法:
# 引用键
# 引用students的内容,使用<< *别名即可,<< 表示合并当前数据
class1:<<: *stusex: man以上内容被读取后输出为:# 键值
students: name: zhangsanage: 12# 引用键
class1:name: zhangsanage: 12sex: 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: <<: *CENTERr: 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行字符串HelloWorld
str3: Hello World
str4: Hello\nWorld
参考
yaml