Jackson:反序列化可能被包装的对象

问题描述 投票:0回答:1

我需要处理来自使用不同模型的不同来源的 JSON。一个是发给我的

{
  "addressData": {
    "street": "Foostreet 1",
    "zip": "12345",
    "city": "Metropolis"
  }
}

还有另一个

{
  "addressData": {
    "address": {
      "street": "Foostreet 1",
      "zip": "12345",
      "city": "Metropolis"
    }
  }
}

即内部内容是相同的,可能只是多了一层包装。到目前为止,我的反序列化 Java 模型看起来像这样

class AddressData {
  private String street;
  private String zip;
  private String city;

  private Address address;
}

class Address {
  private String street;
  private String zip;
  private String city;
}

我在后处理中使用了一个额外的步骤来标准化它。

是否有注释告诉杰克逊该对象可能被附加属性包装,以便我可以跳过这个样板?

java jackson
1个回答
0
投票

我选择了自定义委派

JsonCreator
和手动映射字段。并不完美,但现在就可以了。如果有人有更好的解决方案,请告诉我!

class Address {
    private String street;
    private String zip;
    private String city;

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public Address(JsonNode node) {
        var address = Optional.ofNullable(node.get("address")).orElse(node);
        street = Optional.ofNullable(address.get("street")).map(JsonNode::asText).orElse(null);
        zip = Optional.ofNullable(address.get("zip")).map(JsonNode::asText).orElse(null);
        city = Optional.ofNullable(address.get("city")).map(JsonNode::asText).orElse(null);
}
© www.soinside.com 2019 - 2024. All rights reserved.