我需要处理来自使用不同模型的不同来源的 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;
}
我在后处理中使用了一个额外的步骤来标准化它。
是否有注释告诉杰克逊该对象可能被附加属性包装,以便我可以跳过这个样板?
我选择了自定义委派
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);
}