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

如何将任意JSON字符串反序列化为java POJO?,java,json,jackson,Java,Json,Jackson,假设我们有简单的json字符串json={“key1”:“value1”,“key2”:“value2”}和java类 class Foo { private String field1; private Integer field2; //setter & getter } 此外,我们不想更改Foo类。请注意,json键与Foo的字段名不匹配。 有没有简单的方法可以使用Jackson或任何其他库将json字符串反序列化到Foo类?您可以使用以下json库并构建自定义反序列化程序,如下

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

class Foo {
private String field1;
private Integer field2;
//setter & getter
}
此外,我们不想更改
Foo
类。请注意,json键与Foo的字段名不匹配。
有没有简单的方法可以使用Jackson或任何其他库将json字符串反序列化到
Foo
类?

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

jackson-annotations-2.10.4,
jackson-core-2.10.4,
jackson.数据绑定-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);
    }
}
    
import com.fasterxml.jackson.core.JsonParser;
导入com.fasterxml.jackson.core.JsonProcessingException;
导入com.fasterxml.jackson.databind.DeserializationContext;
导入com.fasterxml.jackson.databind.JsonNode;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.databind.desr.std.StdDeserializer;
导入com.fasterxml.jackson.databind.module.SimpleModule;
导入com.fasterxml.jackson.databind.node.IntNode;
导入java.io.IOException;
公共类反序列化程序扩展StdDeserializer{
公共静态void main(字符串[]args)引发JsonProcessingException{
字符串json=“{\“key1\”:\“value1\”,\“key2\”:100}”;
ObjectMapper mapper=新的ObjectMapper();
SimpleModule=新的SimpleModule();
addDeserializer(Foo.class,new FooDeserializer());
映射器注册表模块(模块);
Foo-Foo=mapper.readValue(json,Foo.class);
系统输出打印项次(foo);
}
公共反序列化程序(){
这个(空);
}
公共反序列化程序(vc类){
超级(vc);
}
@凌驾
public Foo反序列化(JsonParser jp,反序列化上下文ctx)
抛出IOException、JsonProcessingException{
JsonNode节点=jp.getCodec().readTree(jp);
String field1=node.get(“key1”).asText();
int field2=(整数)((IntNode)node.get(“key2”)).numberValue();
返回新的Foo(字段1、字段2);
}
}

编写一个。您可能想要实现其中一个,您可以使用
MixIn
或实现自定义反序列化程序。见:,