前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >180619-Yaml文件语法及读写小结

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

作者头像
一灰灰blog
发布2022-01-17 16:37:43
发布2022-01-17 16:37:43
1.8K00
代码可运行
举报
文章被收录于专栏:小灰灰小灰灰
运行总次数:0
代码可运行

Yaml文件小结

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

<!--more-->

I. 基本语法

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

1. 数组写法

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

代码语言:javascript
代码运行次数:0
运行
复制
- apple
- orange
- banana

2. 对象

一个简单的kv对象

代码语言:javascript
代码运行次数:0
运行
复制
fruit:
  name: banana
  amount: 3
  price: 4.99

加载后数据结构如下:

3. 对象数组

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

代码语言:javascript
代码运行次数:0
运行
复制
-
  name: apple
  price: 1.23
-
  name: orange
  price: 1.33
-
  name: banana
  price: 2.33

加载后数据结构如下:

4. 数组对象

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

代码语言:javascript
代码运行次数:0
运行
复制
name:
  - apple
  - orange
  - banana
price:
  - 4.99
  - 2.34
  - 3.99

加载后数据结构如下:

5. 多维数组

代码语言:javascript
代码运行次数:0
运行
复制
- [apple, 3.88]
- [orange, 3.99]
- [banana, 2.99]

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

6. 对象的扩展写法

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

代码语言:javascript
代码运行次数:0
运行
复制
love: {name: apple, price: 2.99}
hite: {name: orange, price: 1.99}

上面的配置,等同于

代码语言:javascript
代码运行次数:0
运行
复制
love:
  name: apple
  price: 2.99
hite:
  name: orange
  price: 1.99

II. YAML文件读写

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

1. 依赖

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

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
  <groupId>org.yaml</groupId>
  <artifactId>snakeyaml</artifactId>
  <version>1.17</version>
</dependency>

2. 封装类

代码语言:javascript
代码运行次数:0
运行
复制
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:

代码语言:javascript
代码运行次数:0
运行
复制
comment: '#'
skip: "abc\n123"

对应测试用例及输出

代码语言:javascript
代码运行次数:0
运行
复制
@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;
}

输出结果

代码语言:javascript
代码运行次数:0
运行
复制
YamlUtilTest.TC(comment=#, skip=abc
123)

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

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

2. 声明

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/06/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Yaml文件小结
  • I. 基本语法
    • 1. 数组写法
    • 2. 对象
    • 3. 对象数组
    • 4. 数组对象
    • 5. 多维数组
    • 6. 对象的扩展写法
  • II. YAML文件读写
    • 1. 依赖
    • 2. 封装类
  • III. 其他
    • 0. 小结
    • 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    • 2. 声明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档