美文网首页
Jackson—yaml文件内容转换成POJO

Jackson—yaml文件内容转换成POJO

作者: 总有人被感动 | 来源:发表于2022-11-06 21:30 被阅读0次

在日常coding的过程中,我们会碰到一些需要读取自定义yaml文件的需求。Spring框架中集成了Jackson序列化框架,而Jackson也正好可以读取yaml文件。

依赖

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.9.8</version>
</dependency>

1. 序列化为普通的Bean

Sudent.java:

public class Student{
    private String name;
    private int age;
}

student.yaml

name: 张三
age: 5

读取student.yaml文件只需要用YamlFactory初始化一个ObjectMapper

    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    InputStream fis = new ClassPathResource("student.yaml").getInputStream();
    objectMapper.readValue(fis,Student.class)

2. 序列化为List

list_student.yaml:

  - name: 张三
    age: 5
  - name: 李四
    age: 6

读取List<Student>需要用到ObjectReader,用ObjectMapper可得到

    ObjectReader objectReader = objectMapper.readerForListOf(Student.class);
    InputStream fis = new ClassPathResource("list_student.yaml").getInputStream();
    objectReader.readValue(fis);

序列化为map

map_student.yaml:

student1:
    name: 张三
    age: 5
student2:
    name: 李四
    age: 6

读取Map<String,Student>与读取List方法类似

    ObjectReader objectReader = objectMapper.readerForListOf(Student.class);
    InputStream fis = new ClassPathResource("map_student.yaml").getInputStream();
    objectReader.readValue(fis);

读取多key的Map和List结合的yaml文件

仅提供思路,并不一定是最优解。
complex_student.yaml:

class1:
    - teacher1:
          name: 张三
          age: 5
    - teacher2:
          name: 张三
          age: 5

可以看到上面的yaml文件中,最外层的key是class1,里面的value是一个list,而list每项里面又是个map,整体的结构为Map<String,List<Map<String,Student>>>。我们没必要用一个显示的数据结构去接收整个yaml文件,可以拆分成JsonNode去读取。

      fis = new ClassPathResource("complex_student.yaml").getInputStream();
      JsonNode jsonNode = objectMapper.readTree(fis).get("class1");
      ObjectReader objectReader = objectMapper.readerForListOf(ObjectNode.class);
      List<ObjectNode> objectNodes = objectReader.readValue(jsonNode);
      JsonNode currentNode = null;
      for (ObjectNode node : objectNodes) {
        if (Objects.nonNull(node.get("teacher1"))) {
          currentNode = node.get(prod);
        }
      }
      objectReader = objectMapper.readerFor(Student.class);
      objectReader.readValue(currentNode);

以上可以读取到class1 -> teacher1下面的学生姓名,实际操作中,两层map的key可以以参数的形式传进来。

相关文章

网友评论

      本文标题:Jackson—yaml文件内容转换成POJO

      本文链接:https://www.haomeiwen.com/subject/rkjitdtx.html