保持POJO完整无损,如何使用杰克逊在JSON中注入新字段?

问题描述

我的最终目标是,我有 POJO列表。我需要使用Jackson转换为 JSON字符串。在转换为JSON时。我需要再添加几个键。 为此,我只有解决方案。如果我将POJO的列表转换为ObjectNode的列表,以便可以在 ObjectNode 添加信息。之后,我将转换为 JSON字符串

List<dummyPOJO> dummyPOJO = getPOJO(); ObjectNode objectNode = mapper.convertValue(dummyPOJO,new TypeReference<ArrayList<ObjectNode>>(){});

代码给出了跟随错误

java.lang.classCastException: java.util.ArrayList cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

请让我知道是否有可用的解决方案。在此先感谢:)

解决方法

以下代码似乎不正确

ObjectNode objectNode = mapper.convertValue(dummyPOJO,new TypeReference<List<ObjectNode>>(){});

它应该失败

Type mismatch: cannot convert from List<ObjectNode> to ObjectNode

它可以更新为

List<ObjectNode> objectNodes = mapper.convertValue(dummyPOJO,new TypeReference<List<ObjectNode>>(){});

在不更新POJO的情况下,要在json中添加额外的字段,您可以使用以下过程

这是一个简单的POJO,具有3个字段firstName,lastName和age

Person.java

package sep2020;

public class Person {
    public String firstName;
    public String lastName;
    public int age;

    public Person() {
    }

    public Person(String firstName,String lastName,int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String toString() {
        return "[" + firstName + " " + lastName + " " + age + "]";
    }
}

现在将创建一些Person对象并将其转换为List<ObjectNode>结构。

然后将遍历所有ObjectNode,并将在Person ObjectNode中添加新归档的Sex。

但是POJO结构将保持不变。

JSONListConverter.java

package sep2020;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JSONListConverter {
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);

        // Define map which will be converted to JSON
        List<Person> personList = Stream.of(new Person("A","B",34),new Person("C","D",75),new Person("E","F",21),new Person("G","H",55)).collect(Collectors.toList());

        List<ObjectNode> objectNodes = objectMapper.convertValue(personList,new TypeReference<List<ObjectNode>>() {
                });

        JsonNode jsonNode = objectMapper.convertValue(objectNodes,JsonNode.class);
        // Existing Json structure
        System.out.println("Existing Json:\n"
                + objectMapper.writeValueAsString(jsonNode));
        System.out.println("\n\n");
        // Adding an extra field
        if (objectNodes != null && objectNodes.size() > 0) {
            for (ObjectNode objectNode : objectNodes) {
                objectNode.put("Sex","M");
            }
        }
        jsonNode = objectMapper.convertValue(objectNodes,JsonNode.class);
        // Updated Json structure
        System.out.println("Updated Json:\n"
                + objectMapper.writeValueAsString(jsonNode));
    }
}

输出:

Existing Json:

[ {
  "firstName" : "A","lastName" : "B","age" : 34
},{
  "firstName" : "C","lastName" : "D","age" : 75
},{
  "firstName" : "E","lastName" : "F","age" : 21
},{
  "firstName" : "G","lastName" : "H","age" : 55
} ]



Updated Json:

[ {
  "firstName" : "A","age" : 34,"Sex" : "M"
},"age" : 75,"age" : 21,"age" : 55,"Sex" : "M"
} ]