YAML
YAML是一个可读性高,用来表达数据序列的格式。是 “YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。
YAML的语法和其他高级语言类似,可以简单表达清单、散列表,标量等数据形态。由于YAML使用空白字符和分行来分隔数据,使得它特别适合用grep/Python/Perl/Ruby操作。其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构时会变得复杂而难以辨认(字符串中引号需要额外转义)。
设计目标
- 人类容易阅读
- 可用于不同程序间的数据交换
- 适合描述程序所使用的数据结构,特别是脚本语言
- 丰富的表达能力与可扩展性
- 易于使用
语法
- YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
- 使用空白字符为文件缩进来表示结构;不过不能使用制表符符(TAB)。
- 注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
- 在单一文件中,可用连续三个连字号(—)区分多个文件。
另外,还有选择性的连续三个点号( … )用来表示文件结尾。
数据结构
YAML 有三种数据结构,其中 数组和键值对有两种表达方式,数据结构可以嵌套形成复杂的复合结构
- 标量 (基础数据类型)
- 数组 (也被称为序列、列表)
- 键值表(也被称为对象、Map表)
标量
类型 | yaml | json |
---|---|---|
字符串 | str: balabala | { str:”balabala” } |
布尔值 | boolValue: true | { boolValue:true } |
整数 | intValue: 1234 | { intValue:1234 } |
浮点数 | number: 12.30 | { number: 12.30 } |
null | nullValue: ~ | { nullValue: null } |
因为YAML 字符串不需要包在引号之内 所以当出现 str: 123 就会有歧义,难以区分123是字符串还是数值。这个时候可以用 双引号将123 包裹起来,如:str: “123” 。
此外YAML 还提供了强制类型转换,通过两个! 表示值的类型。
比如:str: !!str 123
再比如:floatValue: !!float 123
数组
数组有两中表达方式:
- 使用“-”(横线) + 空格表示单个列表项
1 | --- # 文档开始 |
- 使用 [] 包裹,并用逗号+空格 [, ] 分开成员
1 | --- # 文档开始 |
键值对
键值对 也有两种表达方式,通过配合数组嵌套能够形成复杂的数据结构
使用 “:”(冒号) + 空格表示单个键值对
1
2
3
4
5
6
7
8
9
10# 用户信息
user:
userid: 7654321
userinfo:
name: Mike
age: 28
userfriend:Â
- 小明
- 小红
- 小芳使用 大括号{} 包裹, 并用用逗号+空格分隔 key: value对
1 | # 用户信息 |
特别的。 当键是一个列表或键值表时,可以通过 “? “ 问号+空格表示复杂的键。
字符串
字符串默认不需要加引号。加了单引号和双引号处理特殊字符会有差异。
单引号会转义特殊字符,双引号不会。特别的,如果单引号里面包含单引号 需要额外一个 ‘ 转义
如:1
2
3
4test:
str1: '我是’'字符\n串'
str2: "我是'字符\n串"
# json的写法 { test: { str1: '我是\'字符\\n串', str2: '我是\'字符\n串' }
多行字符串可以使用 | 保留换行符 \n ,也可以使用 > 去除换行。 在该符号之后额外添加+ - 可以保留或移除最后的一堆换行
如
1 | data: > |
锚点
锚点与引用,定义数据的复用。使用 “&” 定义数据锚点(即要复制的数据)使用 * 引用上述锚点数据(即粘贴数据)
1 | str1: &q which language is best? |
参考链接
https://www.wikiwand.com/zh-cn/YAML
http://www.ruanyifeng.com/blog/2016/07/yaml.html
https://blog.csdn.net/liukuan73/article/details/78031693