美文网首页
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