引入
笔者在使用 Hexo + GitPage 搭建博客时初次接触到了.yaml文件,后来又在 SpringBoot 的配置文件中再次碰到了.yaml文件,特此补上关于yaml的blog。
yaml概述
YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。
YAML是一种直观的能够被电脑识别的的数据数据序列化格式,他并且容易被人类阅读,容易和脚本语言交互的。换种说法,YAML是一种很简单的类似于XML的数据描述语言,语法比XML简单很多。他在描述能够被转化成数组或hash的数据是很有用
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
YAML 的配置文件后缀为 .yml或者**.yaml**,但官方更推荐大家使用.yaml。
基本语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- ‘#’表示注释
数据类型
YAML 支持以下几种数据类型:
- 对象:键值对的集合
- 数组:一组按次序排列的值
- 纯量:单个的、不可再分的值(相当于变量)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| student: name: zhangsan age: 12
student1: {name: zhangsan, age: 12}
pets: - dog - pig - cat
pets1: [dog, pig, cat]
|
主要编写规范
序列表示
1、使用“-”(横线) + 单个空格表示单个列表项
2、使用”[]“表示一组数据
3、组合表示。每个结构都可以嵌套组成复杂的表示结构
1 2 3
| - [blue, red, green] - [Age, Bag] - site: {osc:www.oschina.net, baidu: www.baidu.com}
|
键值映射
1、使用 “:”(冒号) + 空格表示单个键值对
1 2 3 4 5 6 7 8
| date: 2015-02-01 customer: - name: Jai items: - no: 1234 - descript: cpu - price: ¥800.00
|
2、使用**”{}”**表示一个键值对集合
1 2 3 4 5
| date: 2015-02-01 customer: - name: Jai items: {no: 1234, descript: cpu, price: ¥800.00}
|
问号+空格表示复杂的键
当键是一个列表或键值表时,就需要使用 ? 来标记
1 2 3 4 5 6 7
| ? [blue, reg, green]: Color ? - blue - reg - gree : Color
|
多种结构组合表示
多种结构可以互相嵌套组成复杂的表示结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Color: - blue - red - green {Color: [blue, red, green]} div: - border: {color: red, width: 2px} - background: {color: green} - padding: [0, 10px, 0, 10px] items: - item: cpu model: i3 price: ¥800.00 - item: HD model: WD price: ¥450.00 items: [{item:cpu, model:i3, price:¥800.00}, {item:HD, model:WD, price: ¥450.00}]
|
文本块操作
1、使用”|”
文本中使用 “|” 和文本内容中自带的缩进表示换行等操作,例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| value: | hello world! 输出结果:hello 换行 world! +表示保留文字块末尾的换行,-表示删除字符串末尾的换行。
value: | hello
value: |- hello
value: |+ hello 输出:hello\n hello hello\n\n(有多少个回车就有多少个\n) 注意 “|” 与 文本之间须另起一行
|
2、使用”>”
文本中使用 “>” 和文本内容中自带的缩进表示将文本中回车替换为空格,最终连接成一行,例子如下:
1 2 3
| value: > hello world! 输出:hello 空格 world!
|
3、使用定界符 “” 及 ‘’
使用定界符 “” 及 ‘’ 包裹的文本会无视自带的换行,也可以包裹空格或者特殊字符来避免需要转义的情况,例子如下:
1 2 3
| value: "somebody said I should put a colon here : so I did" # 然后这个冒号将会被结尾. 输出:somebody said I should put a colon here: so I did
|
数据类型
常见数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| integer: 12345 octal: 0o34 hex: 0xFF
float: 1.23e+3 fixed: 13.67 minmin: -.inf notNumber: .NaN
null: boolean: [true, false] string: ‘12345‘
date: 2015-08-23 datetime: 2015-08-23T02:02:00.1z iso8601: 2015-08-23t21:59:43.10-05:00 spaced: 2015-08-23 21:59:43.10 -5
|
“!”
“!”(叹号)显式指示类型,或自定义类型标识。单叹号通常是自定义类型,双叹号是内置类型,例如:
1 2 3 4 5 6
| isString: !!str 2015-08-23 picture: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs=
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| #下面是内置类型
!!int # 整数类型 !!float # 浮点类型 !!bool # 布尔类型 !!str # 字符串类型 !!binary # 也是字符串类型 !!timestamp # 日期时间类型 !!null # 空值 !!set # 集合 !!omap, !!pairs # 键值列表或对象列表 !!seq # 序列,也是列表 !!map # 键值表
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #下面是一些例子:
--- !!omap - Mark: 65 - Sammy: 63 - Key: 58 --- !!set # 注意,“?”表示键为列表,在这里列表为 null ? Mark ? Sammy ? Key
# 下面是自定义的类型或标识
%TAG ! tag:clarkevans.com,2002: # % 是指令符号 --- !shape # Use the ! handle for presenting # tag:clarkevans.com,2002:circle - !circle center: &ORIGIN {x: 73, y: 129} radius: 7 - !line start: *ORIGIN finish: { x: 89, y: 102 } - !label start: *ORIGIN color: 0xFFEEBB text: Pretty vector drawing.
|
1 2 3 4 5
| #test.yaml(双叹号,强制转换类型) str: !!str 3.14 int: !!int "123"
输出:{'int': 123, 'str': '3.14'} #明显能够看出123被强转成了int类型,而float型的3.14则被强转成了str型
|
锚点和引用
“&” 定义数据锚点(即要复制的数据)
“*” 引用上述锚点数据(即数据的复制目的地)
利用这两个符号就能做到对数据的复用
1 2 3 4 5 6 7
| hr: - Mark McGwire - &SS Sammy Sosa rbi: - *SS - Ken Griffey
|
参考
https://www.csdn.net/tags/MtTaEgwsMDE4NTc1LWJsb2cO0O0O.html
更新
2022-3-27:新增主要编写规范,参考部分