Yaml文件语法及读写小结

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

image.png


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
复制代码


加载后数据结构如下:

image.png


3. 对象数组


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


-
  name: apple
  price: 1.23
-
  name: orange
  price: 1.33
-
  name: banana
  price: 2.33
复制代码


加载后数据结构如下:

image.png


4. 数组对象


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

name:
  - apple
  - orange
  - banana
price:
  - 4.99
  - 2.34
  - 3.99
复制代码


加载后数据结构如下:

image.png


5. 多维数组

- [apple, 3.88]
- [orange, 3.99]
- [banana, 2.99]
复制代码


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

image.png


6. 对象的扩展写法


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


love: {name: apple, price: 2.99}
hite: {name: orange, price: 1.99}
复制代码

image.png


上面的配置,等同于

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月前
|
存储 IDE 测试技术
玩转数据处理利器:学会使用 YAML 文件轻松处理数据
玩转数据处理利器:学会使用 YAML 文件轻松处理数据
154 0
|
1月前
|
XML C语言 数据格式
yaml基本语法
yaml基本语法
56 0
|
1月前
|
机器学习/深度学习 数据可视化 计算机视觉
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
431 1
|
1月前
|
存储 前端开发 IDE
YAML语法记录
YAML语法记录
|
2天前
|
存储 Java 应用服务中间件
后端企业级开发之yaml数据序列化格式文件详解2024
后端企业级开发之yaml数据序列化格式文件详解2024
6 0
|
10天前
|
SQL 监控 Java
实时计算 Flink版产品使用问题之在进行数据同步时,修改了YAML文件以增加新的同步表并取消了之前的同步任务,如何从之前的检查点继续执行
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
25天前
|
Kubernetes 应用服务中间件 数据安全/隐私保护
yaml文件格式详解 及 k8s实战演示
yaml文件格式详解 及 k8s实战演示
|
1月前
|
XML 存储 Java
【OpenCV】—输入输出XML和YAML文件
【OpenCV】—输入输出XML和YAML文件
151 1
|
1月前
|
Java 数据格式 Spring
详解YAML语法及占位符语法
设计了一个YAML数据结构来表示家庭信息,包括家庭名、父亲、母亲和孩子。父亲有名字和年龄,母亲有别名,孩子有名字、年龄和朋友列表,每个朋友有爱好和性别。字符串可以用单引号或双引号,双引号会转义特殊字符。YAML支持松散的键绑定。Spring Boot配置文件中,占位符可用于设置随机数,如${random.int},并可提供默认值,如${family.father.name:zimug}。
|
1月前
|
存储 JSON JavaScript
【YAML语法规范指南】从入门到精通,揭秘神秘语法,引领配置文件解析指南(基础结构篇)
"YAML Ain't Markup Language"(简称YAML)是一种专为人类设计的数据序列化语言,适用于多种现代编程语言,可广泛应用于各类日常任务。它是一种以人类可读形式呈现的、适用于多种语言的Unicode数据序列化标准。它基于敏捷编程中常见的本地数据结构,广泛应用于配置文件、互联网消息传递、对象持久化以及数据审计等多个领域。遵循Unicode标准、
291 8
【YAML语法规范指南】从入门到精通,揭秘神秘语法,引领配置文件解析指南(基础结构篇)