引言
在软件开发和配置管理领域,我们经常需要一种方式来表示和存储数据。这些数据可能是配置参数、文档结构或者是其他形式的结构化信息。YAML(Yet Another Markup Language)就是这样一种被广泛使用的数据序列化语言,它提供了一种简洁而强大的方式来表示这些数据。本文将带你深入了解 YAML 的基本语法和特性。
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
YAML 的配置文件后缀为 .yml,如:application.yml 。
一、 基本语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
- 数据类型
二、YAML 支持以下几种数据类型:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
三、YAML 的基础
YAML 是一种人类友好的数据序列化标准,它的设计目标就是“可读性好”和“易于编写”。它使用类似于缩进和缩写的自然语言语法来表示数据,这使得它非常适合用于配置文件和文档。
1. 基本结构
YAML 的基本结构包括键值对(key-value pairs)和列表(lists)。键和值之间使用冒号(:)分隔,而列表则使用破折号(-)表示。
# 键值对示例
name: John Doe
age: 30
# 列表示例
fruits:
- apple
- banana
- cherry
2. 缩进
YAML 使用缩进来表示数据的层次结构。通常,我们使用两个空格来表示一个缩进级别。不一致的缩进会导致解析错误。
# 正确的缩进
address:
street: 123 Main St
city: Anytown
state: CA
# 错误的缩进
address:
street: 123 Main St
city: Anytown # 注意这里只有一个空格的缩进
state: CA
三、YAML 的高级特性
除了基本结构外,YAML 还提供了一些高级特性,如锚点(anchors)和引用(aliases)、注释、流样式(flow style)和块样式(block style)等。
1. 锚点和引用
YAML 支持通过锚点和引用来复用数据块。这可以在大型配置文件中节省大量的重复内容。
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
在上述示例中,<<: *defaults 表示将 defaults 锚点的内容合并到 development 节点中。
2. 注释
YAML 支持使用井号(#)来表示注释。注释可以放在一行的开始,或者跟在键值对或列表项之后。
# 这是一个注释
name: John Doe # 这也是一个注释
3. 流样式和块样式
YAML 支持两种表示列表和键值对的样式:流样式(紧凑的、内联的)和块样式(展开的、多行的)。
流样式:
fruits: [apple, banana, cherry]
块样式(默认):
fruits:
- apple
- banana
- cherry
一个相对复杂的例子:
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。
数组也可以使用流式(flow)的方式表示:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
4.复合结构
数组和对象可以构成复合结构,例:
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
转换为 json 为:
{
languages: [ 'Ruby', 'Perl', 'Python'],
websites: {
YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org'
}
}