我正在调用返回json对象的rest服务。我正在尝试使用Jackson和数据绑定反序列化对Java Bean的响应。
示例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等(即Map in ServiceResponse看起来像
"{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中打开一个小错误;)