使用jackson从改造中反序列化json,其中相同的变量名称可以表示两个不同的对象

时间:2017-01-04 11:11:24

标签: java android json jackson retrofit2

改造2的反应可能是以下类型。(我们事先不知道哪种反应会来)

{
    "id": "abc",
    "place": "LA",
    "driverId": "abbabaaan"
}

{
    "id": "abc",
    "place": "LA",
    "driverId": {
        "name": "xyz",
        "id": "jygsdsah",
        "car": "merc"
    }
}

有没有办法定义一个类,以便反序列化jackson时会检查对象类型“driverId”是否包含并将其分配给类中的“driverIdObj”字段或“driverIdStr”字段。

4 个答案:

答案 0 :(得分:2)

您可以反序列化为地图。之后,您可以检查地图并决定转换地图的两种类型中的哪一种。看一下这个答案:Deserializing JSON based on object type

要从Map转换为Object,您可以使用ObjectMapper :: convertValue,例如

 mapper.convertValue(map, Response1.class)

答案 1 :(得分:0)

您可以检查json中是否包含值;

String jsonString= "{ ... }";
Object json = new JSONTokener(jsonString).nextValue();
 if (json instanceof JSONObject){ 
   //do operations related with object
 }
else if (json instanceof JSONArray) {
 //do operations based on an array
}

答案 2 :(得分:0)

试试这个

JSONObject jsonObject = new JSONObject("your Response String");
Object obj = jsonObject.get("driverId");    //handle Exceptions
if (obj instanceof String){ 
   //do String stuff
}
else if (obj instanceof JSONObject) {
   //do json object stuff
}

答案 3 :(得分:0)

使用public class Response { private String id, place, driverIdStr; private DriverIdObj driverIdObj; // ... Various getters and setters omitted. public void setDriverId(JsonNode driverId) { if (driverId.isObject()) { // Process the complex version of DriverId. driverIdObj = new DriverIdObj( /* retrieve fields from JsonNode */ ); } else { // Process the simple version of DriverId driverIdStr = driverId.asText(); } } } 类对响应类中的IActionResult字段进行一些特殊处理。如下所示:

throw

这使您可以保持大部分响应的正常方法,同时可以轻松处理特殊字段。