繁体   English   中英

杰克逊数据绑定与异构Json对象

[英]Jackson Data-Binding with Heterogeneous Json Object

我正在调用一个返回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的javadoc是不正确的,因为它声明它应该应用于1-arg方法; 你可以随时在杰克逊开一个小虫子;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM