目录
9.2 多行字符串可以使用|保留换行符,也可以使用>折叠换行。
9.3 +表示保留文字块末尾的换行,-表示删除字符串末尾的换行。
1 YAML 简单介绍
YAML,即YAML Ain’t Markup Language的缩写,YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。
yaml文件其实也是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据,不会改变原有数据类型,所有的数据类型在读取时都会原样输出,yaml文件依赖python的第三方库PyYaml模块
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。YAML 的配置文件后缀为 .yml,如:runoob.yml 。yaml在线转换JavaScript
2 YAML基本语法
- 大小写敏感
- 使用缩进表示层级关系
- 禁止使用tab缩进,只能使用空格键
- 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
- 使用#表示注释
- 字符串可以不用引号标注
3 YAML 组织结构
YAML 文件可以由一或多个文档组成(也即相对独立的组织结构组成),文档间使用“---”(三个横线)在每文档开始作为分隔符。同时,文档也可以使用“...”(三个点号)作为结束符(可选)。如果只是单个文档,分隔符“---”可省略。
4 YAML数据类型
YAML 支持的数据结构有三种:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
5 YAML 对象
5.1 使用 “:”(冒号) + 空格表示单个键值对
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
也可以使用 key: {key1: value1, key2: value2, ...}。
还可以使用缩进表示层级关系;
key:
child-key: value
child-key2: value2
5.2 使用"{}"表示一个键值表
items: {no: 1234, descript: cpu, price: ¥800.00}
5.3 "? " 问号+空格表示复杂的键
"? " 问号+空格表示复杂的键。当键是一个列表或键值表时,就需要使用本符号来标记。
# 使用一个列表作为键
? [blue, reg, green]: Color
# 等价于
? - blue
- reg
- gree
: Color
6 YAML数组
使用一个短横线加一个空格代表一个数组项:
hobby:
- Java
- LOL
当然也可以有这样的写法:
-
- Java
- LOL
可以简单理解为:
[ [ 'Java', 'LOL' ] ]
数组的理解:
PaymentDetail:
- billPaymentNo: "201904171022507929513877465876"
- paymentAmount: 1000.00
- paymentMethod1: "ODD"
- paymentSuccessDate: 2019-04-17 13:00:00
转为 JavaScript 如下:
{ PaymentDetail: null,
' - billPaymentNo': '201904171022507929513877465876',
' - paymentAmount': 1000,
' - paymentMethod1': 'ODD',
' - paymentSuccessDate': Wed Apr 17 2019 21:00:00 GMT+0800 (中国标准时间) }
理解为:PaymentDetail值为一个列表,列表中有四个元素,其中每个元素都是一个字典,每个字典中只有一个键值对
PaymentDetail1:
- billPaymentNo: "201904171022507929513877465876"
paymentAmount: 1000.00
paymentMethod1: "ODD"
paymentSuccessDate: 2019-04-17 13:00:00
转为 JavaScript 如下:
{ PaymentDetail1: null,
' - billPaymentNo': '201904171022507929513877465876',
' paymentAmount': 1000,
' paymentMethod1': 'ODD',
' paymentSuccessDate': Wed Apr 17 2019 21:00:00 GMT+0800 (中国标准时间) }
理解为:PaymentDetail1值为一个列表,列表中只有一个元素,该元素为一个字典,字典由多个键值对构成
7 YAML复合结构
对象和数组可以结合使用,形成复合结构。
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
转为 JavaScript 如下:
{ languages: [ 'Ruby', 'Perl', 'Python' ],
websites: null,
' YAML': 'yaml.org',
' Ruby': 'ruby-lang.org',
' Python': 'python.org',
' Perl': 'use.perl.org' }
8 YAML纯量
字符串
布尔值
整数
浮点数
Null
时间
日期
9 YAML特殊用法
9.1 一般用!!(双叹号)做类型转换
string:
- !!str 54321
- !!str true
转为 JavaScript 如下:
{ string: [ '54321', 'true' ] }
9.2 多行字符串可以使用|保留换行符,也可以使用>折叠换行。
this: |
Foo
Bar
that: |
Foo
Bar
转为 JavaScript 代码如下:
{ this: 'Foo\nBar\n', that: 'Foo\nBar\n' }
9.3 +表示保留文字块末尾的换行,-表示删除字符串末尾的换行。
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
转为 JavaScript 代码如下:
{ s1: 'Foo\n', s2: 'Foo \n', s3: 'Foo' }
9.4 布尔值用true和false表示。
NULL用~表示
10 锚点&和别名*,可以用来引用,定义数据的复用
第一步:使用 “&” 定义数据锚点(即要复制的数据)
第二步:使用 “*” 引用上述锚点数据(即数据的复制目的地)
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
等同于下面的代码:
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
&用来建立锚点(defaults),<<表示合并到当前数据,*用来引用锚点。