【问题标题】:How to deserialize fields into object using jackson?如何使用杰克逊将字段反序列化为对象?
【发布时间】:2018-06-03 20:19:15
【问题描述】:

我尝试将以下 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 是 不可变 对象。

【问题讨论】:

  • 我认为您正在寻找使用 JsonIdentityInfo 注释概述的引用。
  • 你可以有一个包装 Foo 和 Bar 的 Baz 类
  • 看起来FooBarBaz 类具有相同的属性。是真的吗? “许多其他...”表示您还有其他POJOs,看起来像Foo,Bar
  • 抱歉含糊不清。我更新了我的问题。这与循环引用无关。 FooBar 也只是示例。
  • @MichałZiober 是的,我有 10 多个 POJO,例如 FooBar

标签: java json jackson


【解决方案1】:

Jackson 的重点是,您不会处于这种情况。您使用 Jackson 的真正原因是,当您有一个 Baz Java 对象时,它用包含一个对象的 baz JSON 属性表示,而当您有多个字符串 JSON 属性时,它们在 Java 中用几个 String 字段表示同名。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2013-07-10
    • 2017-09-22
    • 2019-11-15
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多