什么是YAML?
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)[3],
但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
是一个可读性高,用来表达数据序列化的格式。
YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。
Clark Evans在2001年首次发表了这种语言[1],另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者[2]。
当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML能干什么用?
YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态
语法特点:
使用空白符号缩进和大量依赖外观
让人最容易上手的特色是巧妙避开各种封闭符号
适用场景:
特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
尽管它比较适合用来表达层次结构式(hierarchical model)的数据结构,不过也有精致的语法可以表示关系性(relational model)的数据。[5]
演示案例:
数据结构可以用类似大纲的缩进方式呈现
---
receipt: Oz-Ware Purchase Invoice
date: 2012-08-06
customer:
given: Dorothy
family: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
size: 8
price: 133.7
quantity: 1
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Centerville
state: KS
ship-to: *id001
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
...
在YAML中,字符串不一定要用双引号标示。
另外,在缩进中空白字符的数目并不是非常重要,只要相同层次结构的元素左侧对齐就可以了(不过不能使用TAB字符)。
这个文件的顶层由七个键值组成:其中一个键值"items",是两个元素构成的数组(或称清单),
这清单中的两个元素同时也是包含了四个键值的散列表。
文件中重复的部分用这个方法处理:使用锚点(&)和引用(*)标签将"bill-to"散列表的内容复制到"ship-to"散列表。
也可以在文件中加入选择性的空行,以增加可读性。
在一个文件中,可同时包含多个文件,并用"---
"分隔。
选择性的符号"...
"可以用来表示文件结尾(在利用流的通信中,这非常有用,可以在不关闭流的情况下,发送结束信号)。
文件预览:
YAML的文件后缀有两种:
- file.yaml
- file.yml
都可以被识别为yaml文件,只不过yml是缩写的再缩写
对比三种配置文件:
XML设置端口号:
<server> <port>8080</port> </server>
Properties设置端口号:
server.port = 8081
YAML设置端口号:
server:
port: 8080
语法 Syntax
基本语法:
KEY: VALUE
KEY表示键,VALUE表示值
要注意的是,VALUE和分号之间必须留有一个空格
空格在YAML中具有特殊的意义:
以空格来控制每一个键值对的层级关系
以左对齐的一列数据,都是同一层级的数据
值的写法:
普通值【数字、字符串、布尔】
- K:V直接书写
- 字符串可不使用引号
- 双引号不会转义特殊字符 如果写\n会换行
- 单引号会转义处理 如果写\n不会换行
对象【属性:值】
- 对象的标识没有值对应
- 属性和值是对象的下一级的多个键值对组成
- 可以横向的书写
数组【List、Set】
列写法 & 行写法