180619-Yaml文件语法及读写小结

Yaml文件小结
Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在Java中实现读写逻辑
I. 基本语法
- 使用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目,但是同层元素一定左对齐,即前面空格数目相同(不要使用tab)
#表示单行注释- 破折号后面跟一个空格(a dash and space)表示列表
- 用冒号和空格表示键值对 key: value
- 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据
- 用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
1. 数组写法
一个简单的数组,用-来列出即可,如下
- apple
- orange
- banana
2. 对象
一个简单的kv对象
fruit:
name: banana
amount: 3
price: 4.99
加载后数据结构如下:

3. 对象数组
首先大结构是数组,但是数组内部是一个kv结构的对象
-
name: apple
price: 1.23
-
name: orange
price: 1.33
-
name: banana
price: 2.33
加载后数据结构如下:

4. 数组对象
首先大结构是对象,对象内部的成员是数组
name:
- apple
- orange
- banana
price:
- 4.99
- 2.34
- 3.99
加载后数据结构如下:

5. 多维数组
- [apple, 3.88]
- [orange, 3.99]
- [banana, 2.99]
用中括号包括起来,形成一个二维数组,加载后的数据结构如下

6. 对象的扩展写法
对于kv结构的对象,支持通过大括号的方式来替代,简化配置文件的行数
love: {name: apple, price: 2.99}
hite: {name: orange, price: 1.99}

上面的配置,等同于
love:
name: apple
price: 2.99
hite:
name: orange
price: 1.99
II. YAML文件读写
在Java生态环境中,读写YAML文件算是比较简单的一个事情了,一个是自己读取文件,然后按照语法进行解析(属于自己造轮子);另外一个就是利用开源库来读写,这里当然是选择已经颇为完善的开源库来处理了
1. 依赖
pom文件中添加maven依赖,版本号查询最新的即可
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.17</version>
</dependency>
2. 封装类
public class YamlUtil {
public static InputStream loadStream(String path) throws IOException {
if (path.startsWith("http")) {
URL url = new URL(path);
return url.openStream();
} else if (path.startsWith("/")) {
return new FileInputStream(path);
} else {
return YamlUtil.class.getClassLoader().getResourceAsStream(path);
}
}
public static <T> T loadConf(String path, Class<T> clz) throws IOException {
try (InputStream inputStream = loadStream(path)) {
Yaml yaml = new Yaml();
return yaml.loadAs(inputStream, clz);
}
}
public static <T> void dumpConf(String save, T obj) throws IOException {
Yaml yaml = new Yaml();
yaml.dump(obj, new BufferedWriter(new FileWriter(save)));
}
}
实现比较简单了,直接利用 Yaml对象的 loadAs/dump 方法即可,对于测试用例,前面的截图已经给出,不再赘述
III. 其他
0. 小结
核心语法:
- 使用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目,但是同层元素一定左对齐,即前面空格数目相同(不要使用tab)
#表示单行注释- 破折号后面跟一个空格表示列表
- 用冒号和空格表示键值对 key: value
- 简单数据可以不使用引号括起来,包括字符串数据
- 用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
转义demo:
comment: '#'
skip: "abc\n123"
对应测试用例及输出
@Test
public void testYamlUtil() throws IOException {
TC map = YamlUtil.loadConf("test.yml", TC.class);
System.out.println(map);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class TC {
private String comment;
private String skip;
}
输出结果
YamlUtilTest.TC(comment=#, skip=abc
123)
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注

180619-Yaml文件语法及读写小结的更多相关文章
- 入门Kubernetes - YAML文件
前言 前篇文章中简单了解到如何把.Net Core 程序部署到k8s中,过程中使用了多个*.yaml文件,那么这些文件的格式及含义.语法是如何的呢? 接下来,进一步了解学习 一.YAML介绍: 1.简 ...
- Python基础笔记1-Python读写yaml文件(使用PyYAML库)
最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下笔记. 一,YAML 简介 YAML,Yet Another Markup Language的简写,通常用来编写项目 ...
- YAML 模板文件语法
YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...
- Python基础笔记2-ruamel.yaml读写yaml文件
上一篇笔记记录了Python中的pyyaml库对yaml文件进行读写,但了解到ruamel.yaml也能对yaml文件进行读写,于是想尝试一下它的用法. 一,注意 这里首先要更正一下网上大部分博客的说 ...
- OpenCV教程(42) xml/yaml文件的读写
参考资料: http://docs.opencv.org/modules/core/doc/xml_yaml_persistence.html #include "opencv2/openc ...
- YAML文件简介
编程免不了要写配置文件,怎么写配置也是一门学问. YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. 本文介绍 YAML 的语法,以 JS-YAML 的实现为例.你可以去 ...
- Docker Kubernetes YAML文件常用指令
YAML文件常用指令 配置文件说明: 定义配置时,指定最新稳定版API(当前为v1). 配置文件应该存储在集群之外的版本控制仓库中.如果需要,可以快速回滚配置.重新创建和恢复. 应该使用YAML格式编 ...
- YAML文件中在单一文件中区分多个文件
1.在单一文件中,可用连续三个连字号(---)区分多个文件. 2.另外,还有选择性的连续三个点号( ... )用来表示文件结尾. 题外:YAML其实语法很多也很灵活,但是针对Spring支持的语法其实 ...
- springboot的yaml基础语法与取值,配置类,配置文件加载优先级
1.基本语法k:(空格)v:表示一对键值对(一个空格必须有):以空格的缩进来控制层级关系:只要是左对齐的一列数据,都是同一个层级的属性和值也是大小写敏感: server: port: 8081 pat ...
随机推荐
- [19/04/05-星期五] 多线程_Thread(线程、线条)、基本术语
一.基本概念 多线程是Java语言的重要特性,大量应用于网络编程.服务器端程序的开发,最常见的UI界面底层原理.操作系统底层原理都大量使用了多线程. 我们可以流畅的点击软件或者游戏中的各种按钮,其实, ...
- ICompare 可比较接口
执行
- 【转】Spring Boot Profile使用
http://blog.csdn.net/he90227/article/details/52981747 摘要: spring Boot使用@Profile注解可以实现不同环境下配置参数的切换,任何 ...
- [后台管理]一套用vue搭建的框架
1.提前的准备工作 前端开发工具有许多,当下流行的sublime等等都是前端比较受欢迎的,nodeJS和Vue等都是前端框架搭建流行的一套 安装nodeJS 设置环境变量 安装Visual Studi ...
- js和jquery对象的相互转换
在使用jquery的过程中发现很多需要将jquery对象转成js对象的例子. Query 对象是通过 jQuery 包装DOM 对象后产生的对象.jQuery 对象是 jQuery 独有的,其可以使用 ...
- 浅析OC语言
学习一门开发语言,首先要掌握的它的基本语法,这可能几天就能学会,但如果要融会贯通,就得去学习这门语言的框架和一些库,再结合一些项目的应用,这可能需要花几年的时间. OC是C语言的一个超集,是一门面向对 ...
- javascript中的栈堆内存
<--------栈内存---------> 俗称叫做作用域(全局作用域/私有作用域) >为js代码提供的执行环境(执行js代码的地方) >基本数据内省是直接存放在栈内存中的 ...
- SQL:登录、连接数据库基本操作
使用MySQL 登录.连接数据库 win+R打开控制台,cmd进入控制台,输入mysql -u root -p,后输入密码,进入数据库: 首先可以查看原有的数据库,输入 show databases; ...
- Kali Basic Configuration
1:Kali Version root@kali-node01:~# cat /etc/os-release PRETTY_NAME="Kali GNU/Linux Rolling" ...
- UIPickerView的简单使用
UIPickerView是一个选择器它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活,使用也比较简单.下面做了一个关于天气预报的小Demo 用 UI ...