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

文章目录
  1. Yaml文件小结
  2. I. 基本语法
    1. 1. 数组写法
    2. 2. 对象
    3. 3. 对象数组
    4. 4. 数组对象
    5. 5. 多维数组
    6. 6. 对象的扩展写法
  3. II. YAML文件读写
    1. 1. 依赖
    2. 2. 封装类
  4. III. 其他
    1. 0. 小结
    2. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    3. 2. 声明
    4. 3. 扫描关注

Yaml文件小结

Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在Java中实现读写逻辑

I. 基本语法

  • 使用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目,但是同层元素一定左对齐,即前面空格数目相同(不要使用tab)
  • # 表示单行注释
  • 破折号后面跟一个空格(a dash and space)表示列表
  • 用冒号和空格表示键值对 key: value
  • 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据
  • 用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符

1. 数组写法

一个简单的数组,用-来列出即可,如下

1
2
3
- apple
- orange
- banana

2. 对象

一个简单的kv对象

1
2
3
4
fruit:
name: banana
amount: 3
price: 4.99

加载后数据结构如下:

yml01

3. 对象数组

首先大结构是数组,但是数组内部是一个kv结构的对象

1
2
3
4
5
6
7
8
9
-
name: apple
price: 1.23
-
name: orange
price: 1.33
-
name: banana
price: 2.33

加载后数据结构如下:

yml02

4. 数组对象

首先大结构是对象,对象内部的成员是数组

1
2
3
4
5
6
7
8
name:
- apple
- orange
- banana
price:
- 4.99
- 2.34
- 3.99

加载后数据结构如下:

yml03

5. 多维数组

1
2
3
- [apple, 3.88]
- [orange, 3.99]
- [banana, 2.99]

用中括号包括起来,形成一个二维数组,加载后的数据结构如下

yml04

6. 对象的扩展写法

对于kv结构的对象,支持通过大括号的方式来替代,简化配置文件的行数

1
2
love: {name: apple, price: 2.99}
hite: {name: orange, price: 1.99}

yml05

上面的配置,等同于

1
2
3
4
5
6
love:
name: apple
price: 2.99
hite:
name: orange
price: 1.99

II. YAML文件读写

在Java生态环境中,读写YAML文件算是比较简单的一个事情了,一个是自己读取文件,然后按照语法进行解析(属于自己造轮子);另外一个就是利用开源库来读写,这里当然是选择已经颇为完善的开源库来处理了

1. 依赖

pom文件中添加maven依赖,版本号查询最新的即可

1
2
3
4
5
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.17</version>
</dependency>

2. 封装类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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:

1
2
comment: '#'
skip: "abc\n123"

对应测试用例及输出

1
2
3
4
5
6
7
8
9
10
11
12
13
@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;
}

输出结果

1
2
YamlUtilTest.TC(comment=#, skip=abc
123)

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

QrCode

# Yaml

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×