[英]How to deserialize fields into object using jackson?
我尝试将以下json反序列化为POJO。
{
"foo": {
"key1":"dummy",
"key2":"dummy"
},
"bar": {
"key1":"dummy",
"key2":"dummy",
"key3":"dummy"
},
"bazKey1":"dummy",
"bazKey2":"dummy",
"bazKey3":"dummy",
"bazKey4":"dummy"
// Many others....
}
您可以在奇怪的baz
属性之上看到...
但是我想将baz
视为foo
和bar
类的对象。
public class Pojo {
private Foo foo;
private Bar bar;
private Baz baz;
// Many others....
}
但是,我发现使用自定义反序列化器的解决方案很差。
@Override
public Pojo deserialize(JsonParser p, DeserializationContext ctxt) throws Exception {
ObjectCodec codec = p.getCodec();
JsonNode node = codec.readTree(p);
Baz baz = new Baz.Builder()
.key1(node.get("bazKey1").textValue())
.key2(node.get("bazKey2").textValue())
.key3(node.get("bazKey3").textValue())
.key4(node.get("bazKey4").textValue())
.build();
// We have to write annoying (setter/constructor/builder) instead of below method.
// return codec.treeToValue(node, Pojo.class);
return new Pojo.Builder()
.foo(foo)
.bar(bar)
.baz(baz)
.other(other)
.other(other)
.other(other) // Many others...
.build();
}
这种解决方案迫使我们使用烦人的东西(设置者/构造者/构建者)。
如何使用杰克逊将字段反序列化为对象?
此外,此POJO是不可变对象。
杰克逊的要点是,您不在这种情况下。 完全使用Jackson的根本原因是,当您拥有一个Baz Java对象时,该对象由包含一个对象的baz JSON属性表示;而当您具有多个字符串JSON属性时,它们在Java中具有多个String字段表示。同名。
如果您不是这种情况,那么就没有理由考虑杰克逊。 使用任何JSON解析库,并从JSON树构建Java对象。 您可以使用Java反射来发现Java类的字段/方法,并根据JSON属性的名称来设置/调用它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.