Jackson与异构Json对象的数据绑定



我正在调用一个返回json对象的rest服务。我正在尝试使用Jackson和数据绑定来反序列化对JavaBeans的响应。

Json的例子是这样的:

{
    detail1: { property1:value1, property2:value2},
    detail2: { property1:value1, property2:value2},
    otherObject: {prop3:value1, prop4:[val1, val2, val3]}
}

从本质上讲,detail1和detail2具有相同的结构,因此可以由单个类类型表示,而OtherObject是另一种类型。

目前,我已经设置了我的类如下(这是我更喜欢的结构):

class ServiceResponse {
    private Map<String, Detail> detailMap;
    private OtherObject otherObject;
    // getters and setters
}
class Detail {
    private String property1;
    private String property2;
    // getters and setters
}
class OtherObject {
    private String prop3;
    private List<String> prop4;
    // getters and setters
}

然后,只需执行:

String response = <call service and get json response>
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(response, ServiceResponse.class)

问题是,我在阅读有关如何正确配置映射和注释以获得所需结构的文档时会迷失方向。我希望detail1、detail2创建Detail类,而otherObject创建otherObject类。

然而,我也希望细节类存储在映射中,这样它们就可以很容易地区分和检索,而且中的服务将来会返回detail3、detail4等"{detail1:Detail object, detail2:Detail object, ...})。

这些类应该如何注释?或者,也许有更好的方法来构建我的类,以适应这个JSON模型?感谢您的帮助。

只需在ServiceResponse中的2-args方法上使用@JsonAnySetter,如下所示:

@JsonAnySetter
public void anySet(String key, Detail value) {
    detailMap.put(key, value);
}

请注意,@JsonAnySetter只能有一个"属性",因为它是未知属性的后备选项。请注意,JsonAnySetter的javadocs是不正确的,因为它指出它应该应用于1-arg方法;你总是可以在Jackson中打开一个小错误;)

最新更新