如何使用jackson将字段反序列化为对象?

时间:2018-06-03 20:19:16

标签: java json 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视为foobar之类的对象。

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是不可变对象。

1 个答案:

答案 0 :(得分:0)

杰克逊的观点是,你不是在这种情况下。完全使用Jackson的原因是因为当你有一个Baz Java对象时,它用一个包含一个对象的baz JSON属性表示,当你有几个字符串JSON属性时,它们用Java表示几个同名的字符串字段。

如果那不是您所处的情况,那么没有理由考虑杰克逊。使用任何JSON解析库,并从JSON树构建Java对象。您可以使用Java反射来发现Java类'字段/方法并根据JSON属性设置/调用它们'名。