yaml 语法和在线解析工具

在线解析工具

工具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: 12students: &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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值