繁体   English   中英

如何使用杰克逊将字段反序列化为对象?

[英]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视为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();
}

这种解决方案迫使我们使用烦人的东西(设置者/构造者/构建者)。


如何使用杰克逊将字段反序列化为对象?
此外,此POJO是不可变对象。

杰克逊的要点是,您不在这种情况下。 完全使用Jackson的根本原因是,当您拥有一个Baz Java对象时,该对象由包含一个对象的baz JSON属性表示;而当您具有多个字符串JSON属性时,它们在Java中具有多个String字段表示。同名。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM