1

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

示例 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 类。

但是,我也希望detail类存储在一个map中,这样可以方便的区分和检索,而且以后的service中会返回detail3、detail4等(即map中的ServiceResponse 看起来像 "{detail1:Detail object, detail2:Detail object, ...})。

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

4

1 回答 1

3

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

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

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

于 2012-08-27T13:31:08.610 回答