Я пытался десериализовать следующий 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 является Неизменным объектом.