当前位置: 首页 > news >正文

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. 扫描关注

相关文章:

  • Zabbix 深度实践
  • Mysql常用命令行大全
  • bootstrap-table教程演示
  • 解析私有云服务器给企业带来的六大优势
  • 手机验证码登录
  • 开源方案搭建可离线的精美矢量切片地图服务-5.Mapbox离线项目实现
  • (搬运以学习)flask 上下文的实现
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • h2db新手入门篇——概念及初步使用
  • Android 布局巧用之include、merge、ViewStub
  • HTML(form标签)、CSS选择器一
  • 初始 Mybatis(一) —— 基本配置及用法
  • OpenStack Newton部署官方指南
  • 小前端眼里的大前端:GMTC 2018 参会小结
  • Rails哲学三原则
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CentOS7简单部署NFS
  • iOS | NSProxy
  • k8s 面向应用开发者的基础命令
  • laravel with 查询列表限制条数
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • npx命令介绍
  • Python学习笔记 字符串拼接
  • vue自定义指令实现v-tap插件
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 排序算法之--选择排序
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 小试R空间处理新库sf
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • - 转 Ext2.0 form使用实例
  • 仓管云——企业云erp功能有哪些?
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 通过调用文摘列表API获取文摘
  • #QT项目实战(天气预报)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (27)4.8 习题课
  • (day6) 319. 灯泡开关
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (done) 两个矩阵 “相似” 是什么意思?
  • (编译到47%失败)to be deleted
  • (二)斐波那契Fabonacci函数
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (转)visual stdio 书签功能介绍
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net通用权限框架B/S (三)--MODEL层(2)
  • /etc/fstab和/etc/mtab的区别
  • @ModelAttribute注解使用
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [20140403]查询是否产生日志
  • [AutoSar]工程中的cpuload陷阱(三)测试