背景
日常工作中,项目编程免不了需要使用配置文件,早期yaml出现之前,大部分配置文件采用xml形式,但是以xml格式储存的数据要比以其他格式(如json、yaml)储存占有的空间要大得多,因为它除了要保存原始数据外还需要保存元数据进行描述。不管你是否相信,笔者曾经在项目中看到xml文件中大量冗余的标签,真的是眼花缭乱,幸运的是,当看见yaml的那一刻,笔者真实地感受到上帝来解救处于水深火热中的那一帮经常与配置文件打交道的程序员了。本文笔者将根据在项目中对yaml的应用简单介绍yaml这样一种让爱程序员爱不释手的数据串行化格式。
简介
与json、xml一样,yaml也是一种通用的数据串行化格式,其设计目标就是方便开发人员的读写,yaml可以表示对象、数组、纯量三种数据格式。
yaml规范
- 大小写敏感
- 使用缩进表示层级
- 缩进的空格数不重要,但是相同层级的元素左侧需要对齐
对象
键值对组合,又称哈希,对象的一组键值对用冒号分割,注意冒号后面必须有空格
debug: true
转换为JAVAScript如下
{"debug":true}
也可以将所有键值对写在一个行内对象
db: {user: root, password: pass123}
转换为JavaScript如下
{"db":{"user":"root", "password":"pass123"}}
数组
一组按次序排列的值,又称序列,数组的每个元素都以连词线“-”开头,连词线“-”后面必须有空格,如下
fruits:
- Apple
- pear
- banana
转换为JavaScript后如下
{"fruits": ["apple", "pear", "banana"]}
也可以表示多维数组,如下
fruitsGroup:
-
- apple
- banana
-
- pear
转换为JavaScript如下
{"fruitsGroup": [["apple", "banana"], ["pear"]]}
与对象一样,数组也可以使用行内表示法,如下
fruits: [apple, banana, pear]
转换为JavaScript如下
{"fruits":["apple", "banana", "pear"]}
复合结构
对象和数组可以结合使用,构成复合结构。如对象数组,每个对象的第一个属性以连词线“-”开头,连词线“-”后面必须要有空格
fruits:
- name: apple
color: red
- name: banana
color: yellow
转换成JavaScript如下
{"fruits":[{"name":"apple", "color":"red"}, {"name":"banana", "color":"yellow"}]}
对象数组也可以使用行内表示法,如下
fruits: [{"name":"apple", "color":"red"}, {"name":"banana", "color":"yellow"}]
转换为JavaScript如下
{"fruits":[{"name":"apple", "color":"red"}, {"name":"banana", "color":"yellow"}]}
纯量
纯量是单独的、最基本的、不可再分的值,包括数值类型(整数、浮点数)、布尔类型、日期时间类型、null类型,字符串类型。
数值直接以字面量的形式表示,如下
weight: 1.0
转换为JavaScript如下
{"weight": 1.0}
布尔值包括true与false,如下
enabled: true
disabled: false
转换为JavaScript如下
{"enabled":true, "disabled":false}
null用~表示,如下
name: ~
转换为JavaScript如下
{"name": null}
日期、时间采用ISO8601格式,如下
date: 2021-06-18T18:00:00+08:00
date1: 2020-06-18
转换为JavaScript如下
{"date": new Date('2021-06-18T18:00:00+08:00'), "date1":new Date('2020-06-18')}
字符串
字符串默认不使用引号,如下
profile: test
如果字符串中包含特殊字符或空格,需要放在引号之中,其中单引号不会对特殊字符转义,双引号会对特殊字符转义,如下
c1: '这是一个n测试'
c2: "这是一个n测试"
转换为JavaScript如下
{"c1":"这是一个\n测试", "c2":"这是一个n测试"}
单引号之中如果还有单引号,需要连续使用两个单引号转义,如下
content: 'that''s all right'
转换为JavaScript如下
{"content": "that's all right"}
字符串可以写成多行,从第二行开始,每一行必须以空格缩进,换行会被转换成空格,如下
content: this
is
test
转换为JavaScript如下
{"content": "this is test"}
多行字符串可以使用"|"保留换行符,或者使用">"折叠换行符,如下
c1: |
thank
you
c2: >
thank
you
转换成JavaScript如下
{'c1': 'thanknyoun', 'c2': 'thank youn'}
"|"后面使用"+"可以保留字符串末尾的换行(默认只保留字符串末尾的第一个换行),"-"可以删除字符串末尾的换行,如下
c1: |+
thank
you
c2: |-
thank
you
转换成JavaScript如下
{'c1': 'thanknyounn', 'c2': 'thank you'}
引用
可以使用锚点"&"和别名"*"来使用yaml中的引用功能,其中"&"用于定义锚点,别名"*"用来引用锚点,如下,"<<"表示合并到当前数据
common: &common
user: zhangsan
password: 123456
test:
profile: test
<<: *common
dev:
profile: dev
<<: *common
等价于下面
common: &common
user: zhangsan
password: 123456
test:
profile: test
user: zhangsan
password: 123456
dev:
profile: dev
user: zhangsan
password: 123456
类似的,纯量也可以使用锚点,如下
- &fruit apple
- banana
- pear
- *fruit
转换为JavaScript如下
['apple', 'banana', 'pear', 'apple']
总结
从上面的案例可以看出yaml相对于传统的xml更简洁,可读性更强,目前笔者所在的项目基本全部采用yaml格式的配置文件,看起来清爽多了。关于yaml的相关用法,读者朋友如果有更多的认识,欢迎文章下方评论,共同学习共同进步。