改造2的反应可能是以下类型。(我们事先不知道哪种反应会来)
{
"id": "abc",
"place": "LA",
"driverId": "abbabaaan"
}
或
{
"id": "abc",
"place": "LA",
"driverId": {
"name": "xyz",
"id": "jygsdsah",
"car": "merc"
}
}
有没有办法定义一个类,以便反序列化jackson时会检查对象类型“driverId”是否包含并将其分配给类中的“driverIdObj”字段或“driverIdStr”字段。
答案 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
这使您可以保持大部分响应的正常方法,同时可以轻松处理特殊字段。