【问题标题】:How arbitrary JSON string can be deserialized to java POJO?如何将任意 JSON 字符串反序列化为 java POJO?
【发布时间】:2020-07-06 14:43:18
【问题描述】:

假设我们有简单的 json 字符串 json = {"key1":"value1", "key2":"value2"} 和 java 类

class Foo {
private String field1;
private Integer field2;
//setter & getter
}

此外,我们不想更改 Foo 类。请注意,json 键与 Foo 的字段名称不匹配。 有没有简单的方法可以使用 Jackson 或任何其他库将 json 字符串反序列化为 Foo 类?

【问题讨论】:

标签: java json jackson


【解决方案1】:

您可以使用以下 json 库并构建自定义反序列化器,如下所示。

jackson-annotations-2.10.4,
杰克逊核心 2.10.4,
jackson.databind-2.10.4

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.node.IntNode;

import java.io.IOException;

public class FooDeserializer extends StdDeserializer<Foo> {


    public static void main (String [] args) throws JsonProcessingException {

        String json = "{\"key1\":\"value1\", \"key2\":100}";
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Foo.class, new FooDeserializer());
        mapper.registerModule(module);

        Foo foo = mapper.readValue(json, Foo.class);

        System.out.println(foo);
    }


    public FooDeserializer() {
        this(null);
    }

    public FooDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Foo deserialize(JsonParser jp, DeserializationContext ctx)
            throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        String field1 = node.get("key1").asText();
        int field2 = (Integer) ((IntNode) node.get("key2")).numberValue();

        return new Foo(field1,field2);
    }
}
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2017-02-06
    • 2017-08-09
    • 2020-02-03
    • 2020-12-10
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多