java读取yaml文件

发布时间 2023-12-21 21:04:59作者: 全栈测试笔记

应用场景

自动化测试中,用例数据存放在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】