文章目录
1、简介
YAML是一个可读性高,用来表达资料序列化的格式;
YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式中获得灵感。Clark Evans在2001年首次发表了该语言;
YAML使用空白字符和分行来分隔数据;
1.1 语法规则
- 大小写敏感;
- 使用缩进表示层级关系;
- 缩进时不允许使用Tab键,只允许使用空格;
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略;
2、数据格式
2.1 数组
--- # 区块格式
values:
- Casablanca
- North by Northwest
- Notorious
--- # 内联格式
values: [milk, pumpkin pie, eggs, juice]
--- # 多维数组
values:
-
- Casablanca
-
- North by Northwest
- Notorious
# 关系数组(key: value)
--- # 区块模式
name: John Smith
age: 33
--- # 內置形式
{name: John Smith, age: 33}
2.2 字符串
字符串一般不需要用引号包裹,但是如果字符串中使用了反斜杠“\”开头的转义字符就必须使用引号包裹;
value:
- Hello without quote # 不用引号包裹
- Hello
world # 拆成多行后会自动在中间添加空格
- 'Hello with single quotes' # 单引号包裹
- "Hello with double quotes" # 双引号包裹
- "I am fine. \u263A" # 使用双引号包裹时支持 Unicode 编码
- "\x0d\x0a is \r\n" # 使用双引号包裹时还支持 Hex 编码
- 'He said: "Hello!"' # 单双引号支持嵌套"
保留换行
使用竖线符“ | ”来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留;
+表示保留文字块末尾的换行,-表示删除字符串末尾的换行。
lines: |
我是第一行
我是第二行
我是吴彦祖
我是第四行
我是第五行
lines2: |+
我是第一行
我是第二行
我是吴彦祖
我是第四行
我是第五行
lines3: |-
我是第一行
我是第二行
我是吴彦祖
我是第四行
我是第五行
# JSON
"lines": "我是第一行\n我是第二行\n 我是吴彦祖\n 我是第四行\n我是第五行"
折叠换行
使用右尖括号“ > ”来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格;
lines: >
我是第一行
我也是第一行
我仍是第一行
我依旧是第一行
我是第二行
这么巧我也是第二行
# JSON
"lines": "我是第一行 我也是第一行 我仍是第一行 我依旧是第一行\n我是第二行 这么巧我也是第二行"
2.3 布尔值
true、True、TRUE、yes、Yes和YES皆为真;
false、False、FALSE、no、No和NO皆为假;
boolean:
- true # True、TRUE
- yes # Yes、YES
- false # False、FALSE
- no # No、NO
2.4 整数
支持二进制表示
int:
- 666
- 0001_0000 # 二进制表示
# JSON
"int": [ 666, 4096 ]
2.5 浮点数
float:
- 3.14
- 6.8523015e+5 # 使用科学计数法
# JSON
"float": [ 3.14, 685230.15 ]
2.6 NULL
null、Null和~都是空,不指定值默认也是空;
nulls:
- null
- Null
- ~
-
# JSON
"nulls": [ null, null, null, null ]
2.7 时间戳
# YAML
date1: 2020-05-26
date2: 2020-05-26T01:00:00+08:00
dete3: 2020-05-26T02:00:00.10+08:00
date4: 2020-05-26 03:00:00.10 +8
// JavaScript
date1: Tue May 26 2020 08:00:00 GMT+0800 (中国标准时间),
date2: Tue May 26 2020 01:00:00 GMT+0800 (中国标准时间),
dete3: Tue May 26 2020 02:00:00 GMT+0800 (中国标准时间),
date4: Tue May 26 2020 03:00:00 GMT+0800 (中国标准时间)
3、类型转换
YAML 支持使用严格类型标签“!!”(双感叹号+目标类型)来强制转换类型;
# YAML
a: !!float '666' # !! 为严格类型标签
b: '666' # 其实双引号也算是类型转换符
c: !!str 666 # 整数转为字符串
d: !!str 666.66 # 浮点数转为字符串
e: !!str true # 布尔值转为字符串
f: !!str yes # 布尔值转为字符串
# JSON
"a": 666,
"b": "666",
"c": "666",
"d": "666.66",
"e": "true"
"f": "yes"
4、其他高级类型
4.1 引用、锚点标签
可以快速引用相同的一些数据
# YAML
a: &anchor # 设置锚点
one: 1
two: 2
three: 3
b: *anchor # 引用锚点
# JSON
"a": {
"one": 1,
"two": 2,
"three": 3
},
"b": {
"one": 1,
"two": 2,
"three": 3
}
4.2 合并标签
使用可以与任意数据进行合并,你可以把这套操作想象成面向对象语言中的继承;
# YAML
human: &base # 添加名为 base 的锚点
body: 1
hair: 999
singer:
<<: *base # 引用 base 锚点,实例化时会自动展开
skill: sing # 添加额外的属性
programer:
<<: *base # 引用 base 锚点,实例化时会自动展开
hair: 6 # 覆写 base 中的属性
skill: code # 添加额外的属性
// JSON
"human": { "body": 1, "hair": 999 },
"singer": { "body": 1, "hair": 999, "skill": "sing" },
"programer": { "body": 1, "hair": 6, "skill": "code" }
参考
https://www.ruanyifeng.com/blog/2016/07/yaml.html
https://zh.wikipedia.org/wiki/YAML