YAML配置文件,之间在一些代码工程和python学习中接触过,但是一直没有弄明白这是一种什么样的文件和标记语言,今天就开始学下,以下内容是摘自网上:
YAML(Yet Another Markup Language)(发音 /ˈjæməl/ )
一种基于Unicode容易阅读,容易和脚本语言交互的,用来表达资料序列的编程语言。
适应场景 脚本语言:由于实现简单,解析成本很低,YAML 特别适合在脚本语言中使用 序列化: YAML是由宿主语言数据类型直转,的比较适合做序列化。 配置文件:写 YAML 要比写 XML 快得多(无需关注标签或引号),并且比 INI 文档功能更强。由于兼容性问题,不同语言间的数据流转建议不要用 YAML。 语言优点 YAML易于人们阅读。 YAML数据在编程语言之间是可移植的。 YAML匹配敏捷语言的本机数据结构。 YAML具有一致的模型来支持通用工具。 YAML支持单程处理。 YAML具有表现力和可扩展性。 YAML易于实现和使用。 YAML 语法 使用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目,但是同层元素一定左对齐,即前面空格数目相同(不能使用 Tab,各个系统 Tab对应的 Space 数目可能不同,导致层次混乱) ‘#’表示注释,只能单行注释,从#开始处到行尾 破折号后面跟一个空格(a dash and space)表示列表 用冒号和空格表示键值对 key: value 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符 Sequence of Scalars 简单数据列表
- Mark McGwire - Sammy Sosa - Ken Griffey
Mapping Scalars to Scalars 简单数据键值对以及注释
hr: 65 # Home runs avg: 0.278 # Batting average rbi: 147 # Runs Batted Mapping Scalars to Sequences 简单数据列表键值对
american: - Boston Red Sox - Detroit Tigers - New York Yankees national: - New York Mets - Chicago Cubs - Atlanta Braves
Sequence of Mappings 键值对列表
- name: Mark McGwire hr: 65 avg: 0.278 - name: Sammy Sosa hr: 63 avg: 0.288 YAML 还支持流类型,用中括号括起来表示列表,用逗号分隔元素;用大括号括起来表示键值对,用逗号分隔元素。 Sequence of Sequences 列表的列表
- [name , hr, avg ] - [Mark McGwire, 65, 0.278] - [Sammy Sosa , 63, 0.288]
Mapping of Mappings 键值对的键值对
Mark McGwire: {hr: 65, avg: 0.278} Sammy Sosa: { hr: 63, avg: 0.288 }
适应场景
脚本语言:由于实现简单,解析成本很低,YAML 特别适合在脚本语言中使用
序列化: YAML是由宿主语言数据类型直转,的比较适合做序列化。
配置文件:写 YAML 要比写 XML 快得多(无需关注标签或引号),并且比 INI 文档功能更强。由于兼容性问题,不同语言间的数据流转建议不要用 YAML。
语言优点
YAML易于人们阅读。
YAML数据在编程语言之间是可移植的。
YAML匹配敏捷语言的本机数据结构。
YAML具有一致的模型来支持通用工具。
YAML支持单程处理。
YAML具有表现力和可扩展性。
YAML易于实现和使用。
YAML 语法
使用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目,但是同层元素一定左对齐,即前面空格数目相同(不能使用 Tab,各个系统 Tab对应的 Space 数目可能不同,导致层次混乱)
‘#’表示注释,只能单行注释,从#开始处到行尾
破折号后面跟一个空格(a dash and space)表示列表
用冒号和空格表示键值对 key: value
简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
---------------------
作者:beginya
来源:CSDN
原文:https://blog.csdn.net/beginya/article/details/76768968
版权声明:本文为博主原创文章,转载请附上博文链接!
1、基本语法
格式要求
k:(空格)v:表示一对键值对(空格必须有);空格的个数不重要,只要相同层级的元素左对齐即可
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:
port: 8081
path: /hello
- 属性和值也是大小写敏感;
2、值的写法
字面量:普通的值(数字,字符串,布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
”:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
对象、Map(属性和值)(键值对):
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式
friends:
lastName: zhangsan
age: 20
- 1
- 2
- 3
行内写法:
friends: {lastName: zhangsan,age: 18}
- 1
数组(List、Set):
用- 值表示数组中的一个元素
pets:
- cat
- dog
- pig
- 1
- 2
- 3
- 4
行内写法
pets: [cat,dog,pig]
- 1
1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的)
@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
prefix = “person”:配置文件中哪个下面的所有属性进行一一映射
二、yaml语法
1、基本规则
1. 大小写敏感
2. 使用缩进表示层级关系
3. 缩进时不允许使用Tab,只允许使用空格
4. 缩进的空格数目不重要,只要相同层级的元素左对齐即可
5. # 表示注释,从它开始到行尾都被忽略
- 1
- 2
- 3
- 4
- 5
- 6
2、yaml转字典
yaml中支持映射或字典的表示,如下:
# 下面格式读到Python里会是个dict
name: 灰蓝
age: 0
job: Tester
- 1
- 2
- 3
- 4
输出:
{'name': '灰蓝', 'age': 0, 'job': 'Tester'}
- 1
3、yaml转列表
yaml中支持列表或数组的表示,如下:
# 下面格式读到Python里会是个list
- 灰蓝
- 0
- Tester
- 1
- 2
- 3
- 4
输出:
['灰蓝', 0, 'Tester']
- 1
4、复合结构:
字典和列表可以复合起来使用,如下:
# 下面格式读到Python里是个list里包含dict
- name: 灰蓝
age: 0
job: Tester
- name: James
age: 30
- 1
- 2
- 3
- 4
- 5
- 6
输出:
[{'name': '灰蓝', 'age': 0, 'job': 'Tester'}, {'name': 'James', 'age': 30}]
- 1
5、基本类型:
yaml中有以下基本类型:
字符串
整型
浮点型
布尔型
null
时间
日期
- 1
- 2
- 3
- 4
- 5
- 6
- 7
我们写个例子来看下:
# 这个例子输出一个字典,其中value包括所有基本类型
str: "Hello World!"
int: 110
float: 3.141
boolean: true # or false
None: null # 也可以用 ~ 号来表示 null
time: 2016-09-22t11:43:30.20+08:00 # ISO8601,写法百度
date: 2016-09-22 # 同样ISO8601
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
输出:
{'str': 'Hello World!', 'int': 110, 'float': 3.141, 'boolean': True, 'None': None, 'time': datetime.datetime(2016, 9, 22, 3, 43, 30, 200000), 'date': datetime.date(2016, 9, 22)}
- 1
如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,则需要加引号了
str: 灰蓝
str1: "Hello World"
str2: "Hello\nWorld"
- 1
- 2
- 3
输出:
{'str': '灰蓝', 'str1': 'Hello World', 'str2': 'Hello\nWorld'}
- 1
这里要注意单引号和双引号的区别,单引号中的特殊字符转到Python会被转义,也就是到最后是原样输出了,双引号不会被Python转义,到最后是输出了特殊字符;如:
str1: 'Hello\nWorld'
str2: "Hello\nWorld"
- 1
- 2
输出:
{'str1': 'Hello\\nWorld', 'str2': 'Hello\nWorld'}
- 1
可以看到,单引号中的’\n’最后是输出了,双引号中的’\n’最后是转义成了回车
6、引用
& 和 * 用于引用
name: &name 灰蓝
tester: *name
- 1
- 2
这个相当于一下脚本:
name: 灰蓝
tester: 灰蓝
- 1
- 2
输出:
{'name': '灰蓝', 'tester': '灰蓝'}
- 1
7、强制转换
yaml是可以进行强制转换的,用 !! 实现,如下:
str: !!str 3.14
int: !!int "123"
- 1
- 2
输出:
{'int': 123, 'str': '3.14'}
- 1
明显能够看出123被强转成了int类型,而float型的3.14则被强转成了str型。
8、分段
在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中
---
name: James
age: 20
---
name: Lily
age: 19