【JAVA接口自动化】JAVA如何读取Yaml文档

news/2025/9/19 19:16:45/文章来源:https://www.cnblogs.com/ljbguanli/p/19101531

【JAVA接口自动化】JAVA如何读取Yaml文档

java读取yaml文件 自动化测试中,用例数据存放在yaml文件中

数据存储

我们采用yaml存储数据文件 按照我下面的方式创建

yaml文件数据

接下来我们创建并构造三个yaml文件,用于我们在JAVA中进行读取yaml文件数据,依次创建yaml文件如下: person.yaml

---
id: 1
name: rebort
age: 18
---
id: 2
name: rebort-rebort
age: 19

person2.yaml

---
- id: 3
name: 小rebort
age: 18
- id: 4
name: 技巧工人
age: 19

person3.yaml

---
- id: 5
name: rebort大哥
age: 18
- id: 6
name: 测试一下,干
age: 19

接下来编写读取yaml文件的JAVA代码

public class Person {
private String id;
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}

编写JAVA代码读取yaml文件数据,并返回对象

在编写读取文件代码之前,我们先将yaml文件读取所需要的依赖添加一下,我这里使用的是maven,所以我直接在pom.xml中添加 如下:

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;
public class ReadDataFromYaml {
public static Person getData(String path, Person p){
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
try {
return objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), p.getClass());
} catch (IOException e) {
System.out.println("读取异常:" + e);
}
return null;
}
public static void main(String[] args) {
Person p = new Person();
p = getData("/caseData/person.yaml", p);
System.out.println(p);
if (p!=null){
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
}

运行代码后查看此时控制台的输出打印情况

可以看到我们已经读取到了yaml中的数据,并且打印在控制台显示 可以在控制台看到具体的数据信息

接下来我们优化了代码,使用优化:泛型,传字节码

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;
public class ReadDataFromYaml {
public static  T getData(String path, Class clazz){
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
try {
T obj = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), clazz);
return obj;
} catch (Exception e) {
System.out.println("异常:" + e);
}
return null;
}
public static void main(String[] args) {
Person p = getData("/caseData/person.yaml", Person.class);
System.out.println(p);
if (p!=null){
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
}

再次查看此时控制台的输出打印,是不是同样也能看到输出的打印信息

如何读取yaml文件,并返回对象list,接下来我们将代码优化为返回list

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ReadDataFromYaml {
public static List getData(String path, List plist){
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
try {
plist = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), plist.getClass());
return plist;
} catch (IOException e) {
System.out.println("读取异常:" + e);
}
return null;
}
public static void main(String[] args) {
List plist = new ArrayList();
plist = getData("/caseData/person2.yaml", plist);
System.out.println(plist);
}
}

运行代码此时查看控制台的输出打印情况

再次优化读取返回对象list的代码,使用泛型的方式,返回字节码

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.hwapitest.utils.Person;
public class ReadDataFromYaml {
public static  List getData(String path, Class clazz){
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
try {
List list = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), List.class);
return list;
} catch (IOException e) {
System.out.println("读取异常:" + e);
}
return null;
}
public static void main(String[] args) {
List plist = new ArrayList();
List plist1 = getData("/caseData/person2.yaml", Person.class);
if ( plist1!=null){
plist.addAll(plist1);
}
List plist2 = getData("/caseData/person2.yaml", Person.class);
if ( plist2!=null){
plist.addAll(plist2);
}
System.out.println(plist);
}
}

再次运行代码,可以看到控制台输出打印结果

问题

上面可以把多个yaml的数据放到一个list里面

但是,如果打印对象内容(模拟解析测试用例数据)

public static void main(String[] args) {
List plist = new ArrayList();
List plist1 = getData("/caseData/person2.yaml", Person.class);
if ( plist1!=null){
plist.addAll(plist1);
}
List plist2 = getData("/caseData/person2.yaml", Person.class);
if ( plist2!=null){
plist.addAll(plist2);
}
System.out.println(plist);
for (Person person : plist2) {
System.out.println(person.getName());
}
}

运行结果后会看到如下的报错情况

通过debug发现,list的元素是LinkedHashMap类型

解决方案:

装换位指定的类型

package com.hwapitest.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
public class ReadDataFromYaml {
public static List getData(String path) {
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
try {
List list = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), List.class);
// 转成指定类型的list集合
List list_new = objectMapper.convertValue(list, new TypeReference>() {});
return list_new;
} catch (Exception e) {
System.out.println("异常:" + e);
}
return null;
}
public static void main(String[] args) {
List plist = new ArrayList();
List plist1 = getData("/caseData/person2.yaml");
if ( plist1!=null){
plist.addAll(plist1);
}
List plist2 = getData("/caseData/person3.yaml");
if ( plist2!=null){
plist.addAll(plist2);
for (Person person : plist2) {
System.out.println(person.getId());
System.out.println(person.getName());
System.out.println(person.getAge());
}
}
System.out.println(plist);
}
}

再次运行后可以看到打印输出多个文件的yaml数据

思考

上面解决方案中,我们把类型写死了,如果作为一个工具类,如何实现传任意类型?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:uni-app 常用钩子函数:从场景到实战,掌握开发核心

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

PyTorch Weight Decay 技术指南

Weight Decay(权重衰减)是深度学习中重要的正则化技术,通过在训练过程中对模型权重施加惩罚,防止过拟合,提升模型泛化能力。PyTorch Weight Decay 技术指南 目录摘要 概念与理论2.1 核心概念 2.2 与 L2 正则化的关…

AUTOSAR进阶图解==>AUTOSAR_SWS_PDURouter - 实践

AUTOSAR进阶图解==>AUTOSAR_SWS_PDURouter - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

getDefaultMidwayLoggerConfig报错;解决方法。

getDefaultMidwayLoggerConfig报错;解决方法。 解决方案:配置环境变量:MIDWAY_LOGGER_WRITEABLE_DIR源码是:getDefaultMidwayLoggerConfig(appInfo) { var _a; const isDevelopment = (0, util_1.isDevelopmentEn…

js获取浏览器语言,以及调用谷歌翻译api翻译成相应的内容

翻译接口:https://translate.googleapis.com/translate_a/single?client=gtx&sl=(翻译前的语言)&tl=(翻译后的语言)&dt=t&q=(需要翻译的内容)调用案例: https://translate.googleapis.com/tr…

总结RocketMQ中的常见问题

总结RocketMQ中的常见问题 一、MQ 如何保证消息不丢失 1. 丢消息的关键环节跨网络环节:消息链路中1(生产者→Broker)、2(Broker 主→从)、4(Broker→消费者) 三个场景,因网络不稳定性可能导致请求丢失。 本地缓…

The 2025 ICPC Asia EC Regionals Online Contest (II)

疑似第一场没题解?那先写第二场了。 大家打得很棒,状态起来了!继续保持。 B. Rectangular Wooden Block给定 \(L\times W\times H\) 的长方体,每个 \(1\times 1\times 1\) 的小立方体有价值 \(V(i,j,k)\),选择其中…

Python实现Elman RNN与混合RNN神经网络对航空客运量、啤酒产量、电力产量时间序列数据预测可视化对比

全文链接:https://tecdat.cn/?p=43924原文出处:拓端数据部落公众号视频出处:拓端抖音号@拓端tecdat一、引言 作为长期深耕时间序列预测领域的数据科学家,我们在项目中频繁发现一个共性痛点:多数团队在选择循环神…

4G/Wi-Fi/以太网三网合一,智能融合通信实战案例集

聚焦通信技术落地痛点,4G/Wi-Fi/以太网智能多网融合方案,通过动态负载均衡与故障自愈机制,构建高可用通信链路。实战场景覆盖远程监控、智能交通等领域,技术细节与实施步骤全解析。 本文以Air8000开发板WebSocket应…

关于介绍自己的第一篇随笔

你好啊,我是张家瑞,一名普通平凡的学生。 仔细想来我的兴趣爱好也没什么特别的,也同他人一样爱打打游戏听听音乐,非常喜欢格斗游戏和卡牌游戏,若有喜欢街霸,罪恶装备,游戏王的同学可以找我打(开个玩笑),稍微…

深入解析:N32G43x Flash 驱动移植与封装实践

深入解析:N32G43x Flash 驱动移植与封装实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

Backblaze上如何传大文件

问题 创建好一个存储桶后,直接点击上传文件即可。但是当文件很大时将会显示:第一次通过以下步骤解决 第一步:准备工作 1.安装命令行工具 (B2 CLI) pip install --upgrade b2检验安装是否成功(可选) b2 version显示:…

解题报告-老逗找基友 (friends)

老逗找基友 (friends) 题目背景 吴老逗有 \(n\) 个基友,位于平面直角坐标系的整点上。每个基友已与其最近的基友(如有多个则取编号最小)建立了双向心灵感应。但这样形成的网络可能不连通,因此吴老逗可以使用爱之魔…

Python_occ 学习记录 | 细观建模(1) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:uv:用 Rust 重写的极速 Python 包管理器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Caused by: java.lang.ClassNotFoundException: org.apache.rocketmq.remoting.common.RemotingUtil

前言 启动报错,打包可以,启动报错; 针对这个问题 可以看下.ClassNotFoundException和NoClassDefFoundError:有啥区别先 org.springframework.beans.factory.BeanCreationException: Error creating bean with name …

VAE In JAX【个人记录向】

和上一篇 SAC In JAX 一样,我们用 JAX 实现 VAE,配置一样,只需要安装符合版本的 torchvision 即可,实现中提供了 tensorboard 记录以及最后的可视化展示,测试集即为最经典的 MNIST,代码如下: import jax import…

BLE蓝牙配网双模式实操:STA+SoftAP技术原理与避坑指南

想让设备同时支持蓝牙快速配网与AP热点备份?STA+SoftAP双模式是关键!本文深度解析技术原理,结合真实项目案例总结实操避坑点,助你一文搞懂双模式配网逻辑,开发少走90%弯路。 本文特别分享蓝牙配网方案: 以Air800…

【小白也能懂】PyTorch 里的 0.5 到底是干啥的?——一次把 Normalize 讲透! - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …