首页 > 编程语言 >java读取yaml文件

java读取yaml文件

时间:2023-12-21 21:12:53浏览次数:50  
标签:java 读取 List yaml println import com public

应用场景

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

 

数据

 

person.yaml

---
id: 1
name: 韧
age: 18
---
id: 2
name: qzcsbj
age: 19

  

person2.yaml

---
- id: 3
  name: 小韧
  age: 18

- id: 4
  name: 全栈测试笔记
  age: 19

  

person3.yaml

---
- id: 5
  name: 韧哥
  age: 18

- id: 6
  name: 性能测试
  age: 19

  

Person.java

package com.test.bean;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
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 + '\'' +
                '}';
    }
}

  

读取并返回对象

package com.test.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.test.bean.Person;
import java.io.IOException;



/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
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());
        }
    }
}

  

结果

 

优化:泛型,传字节码

package com.test.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.test.bean.Person;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
public class ReadDataFromYaml {

    public static <T> T getData(String path, Class<T> 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());
        }
    }
}

 

结果

 

 

读取并返回对象list

package com.test.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.test.bean.Person;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
public class ReadDataFromYaml {

    public static List<Person> getData(String path, List<Person> 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<Person> plist = new ArrayList<Person>();
        plist = getData("/caseData/person2.yaml", plist);
        System.out.println(plist);
    }
}

  

结果

 

优化:泛型,传字节码

package com.test.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.test.bean.Person;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
public class ReadDataFromYaml {

    public static <T> List<T> getData(String path, Class<T> clazz){
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
        try {
            List<T> 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<Person> plist = new ArrayList<Person>();
        List<Person> plist1 = getData("/caseData/person2.yaml", Person.class);

        if ( plist1!=null){

            plist.addAll(plist1);
        }
        List<Person> 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<Person> plist = new ArrayList<Person>();
        List<Person> plist1 = getData("/caseData/person2.yaml", Person.class);

        if ( plist1!=null){
            plist.addAll(plist1);
        }
        List<Person> 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());
        }
    }

  

结果报错:

[{id=3, name=小韧, age=18}, {id=4, name=全栈测试笔记, age=19}, {id=3, name=小韧, age=18}, {id=4, name=全栈测试笔记, age=19}]
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.test.bean.Person
	at com.test.utils.ReadDataFromYaml.main(ReadDataFromYaml.java:39)

 

 

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

 

解决方案:转换为指定类型

package com.test.utils;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.test.bean.Person;
import java.util.ArrayList;
import java.util.List;

/**
 * @公众号 : 全栈测试笔记
 * @博客 : www.cnblogs.com/uncleyong
 * @微信 : ren168632201
 * @描述 : <>
 */
public class ReadDataFromYaml {
    public static List<Person> getData(String path) {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
        try {
            List list = objectMapper.readValue(ReadDataFromYaml.class.getResourceAsStream(path), List.class);

            // 转成指定类型的list集合
            List<Person> list_new = objectMapper.convertValue(list, new TypeReference<List<Person>>() {});
            return list_new;

        } catch (Exception e) {
            System.out.println("异常:" + e);
        }
        return null;
    }

    public static void main(String[] args) {
        List<Person> plist = new ArrayList<Person>();
        List<Person> plist1 = getData("/caseData/person2.yaml");

        if ( plist1!=null){
            plist.addAll(plist1);
        }
        List<Person> 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);
    }
}

 

结果  

 

思考题

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

 

【bak】

 

标签:java,读取,List,yaml,println,import,com,public
From: https://www.cnblogs.com/uncleyong/p/17919705.html

相关文章

  • PHP读取word文档
    1.安装1.1composer安装phpoffice/phpwordcomposerrequirephpoffice/phpword1.2后台代码 $file=$this->request->request('file');if(!$file){$this->error(__('Parameter%scannotbeempty','file......
  • JavaScript 中 for-in 循环和 for-of 循环的区别和适用场景
    前言在JavaScript中,循环是一种非常常见的操作。其中,for-in循环和for-of循环是两种常用的循环方式。本文将详细介绍这两种循环方式的用法、特点以及适用场景,帮助读者更好地理解和应用它们。正文内容一、for-in循环1.用法for-in循环用于遍历对象的属性。其基本语法如下:......
  • module java.base does not export sun.net.util to unnamed module
    目录使用jdk17启动flink1.15报错:java.lang.reflect.InaccessibleObjectException:Unabletomakefieldprivatefinalbyte[]java.lang.String.valueaccessible:modulejava.basedoesnot"opensjava.lang"tounnamedmodule@6e60f18解决办法:启动参数添加add-opens......
  • java中字符串的比较以及string 方法图解
    最近在项目中经常要用到字符串的比较,因此做了一个简略的总结,希望对大家有所帮助!!!!!!!!!!!!!!!1总体来说java中字符串的比较是比较引用,equals比较值的做法。(equals对于其他引用类型比较的是地址,这是因为object的equals方法比较的是引用),但是不同的声明方法字符串的比较结果也是不同的。例如:S......
  • java中对于jvm虚拟机进程的操作类
    在java中,Runtime类表示运行时操作类,是一个封装了JVM进程的类,每一个JVM都对应着一个Runtime类的实例,此实例由JVM运行时为其实例化。下面图示演示了其方法以及应用。......
  • java Stream
    一、Stream1、概述 2、Stream流使用过程 示例图: 3、 Stream流的常见生成方式 示例:packageitbianma01;importjava.util.*;importjava.util.stream.Stream;publicclassDemo{publicstaticvoidmain(String[]args){//方式一:Collection......
  • JavaScript 数组方法重写
    constlist=[1,2,3]Array.prototype.myForeach=function(fn){for(leti=0;i<this.length;i++){fn(this[i],i,this)}}Array.prototype.myMap=function(fn){const_list=[]for(leti=0;i<this.length;i......
  • Java基础语法入门
    1.引言:Java是一门强大而广泛应用的编程语言,其灵活性和可靠性使其成为许多开发者的首选。不仅在企业级应用程序中发挥着重要作用,而且在移动应用、大数据处理和嵌入式系统等领域也得到了广泛运用。学习Java是成为一名全栈开发者的绝佳起点之一,因为它具有跨平台性、面向对象的特性以......
  • CPU处理数据 vs IO读取数据
    CPU密集型(文件/数据的复杂) 指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPULoading100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPULoading很高。CPU密集的意思该任务需要大量的运算,而没有阻塞,CPU一直全速运行。......
  • 若依框架跑起来,Java小白入门(一)
    背景本人Java小白,有一点编程基础(c#)。企业数字化建设大环境是JAVA,所以需要搞起来,而学习最快的方式就是读代码,学以致用干项目。所以这个系列就是从小白看能否变成小黑。码云上有很多框架,所以需要选择一款容易入手的,看star量和历史,以及各种ruoyi变异版本,路径就比较清楚,本身其有......