且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何将任意JSON字符串反序列化为Java POJO?

更新时间:2023-02-18 17:29:57

您可以使用以下json库并构建自定义解串器,如下所示.

You can use the following json libraries and build a custom deserializer as shown below.

jackson-annotations-2.10.4,
jackson-core-2.10.4,
jackson.databind-2.10.4

jackson-annotations-2.10.4,
jackson-core-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);
    }
}