我尝试将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();
}
这个解决方案迫使我们使用烦人的(setter / constructor / builder)。
如何使用jackson将字段反序列化为对象?
此外,此POJO是不可变对象。
答案 0 :(得分:0)
杰克逊的观点是,你不是在这种情况下。完全使用Jackson的原因是因为当你有一个Baz Java对象时,它用一个包含一个对象的baz JSON属性表示,当你有几个字符串JSON属性时,它们用Java表示几个同名的字符串字段。
如果那不是您所处的情况,那么没有理由考虑杰克逊。使用任何JSON解析库,并从JSON树构建Java对象。您可以使用Java反射来发现Java类'字段/方法并根据JSON属性设置/调用它们'名。