2017-01-04 4 views
3

Ответ от retrofit2 могут быть следующих типов. (И мы не знаем, прежде чем рука, ответ придет)десериализации JSON с использованием модифицированной Джексону, где же имя переменной может представлять собой два различных объекта

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

или

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

есть ли способ определить класс таким образом, чтобы при десериализации джексон будет проверять тип объекта «driverId» содержит и присваивает ему сказать, поле «driverIdObj» или поле «driverIdStr» в классе.

+0

Вы должны написать собственную схему десериализации для ключевого драйвера. –

+0

Dharmendra Можете ли вы предоставить некоторую ссылку или намекнуть на какой-то код, который может мне помочь? – Debanjan

ответ

2

Вы можете десериализации на карте. Затем вы можете проверить карту и решить, какой из двух типов вы преобразуете карту. Взгляните на этот ответ: Deserializing JSON based on object type

Для преобразования карты в объект можно использовать ObjectMapper :: convertValue, например

mapper.convertValue(map, Response1.class) 
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 
} 
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 
} 
+0

Но поскольку я использую Jackson с модификацией 2, это будет полезно, если это можно сделать с некоторыми настройками, возможно, в Jackson Deserializer или в другом месте. Это очень простой способ. – Debanjan

0

Запаситесь специальную обработку для driverId поля в классе ответа, используя JsonNode класс , Что-то вроде следующего:

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(); 
     } 
    } 
} 

Это позволяет поддерживать нормальный подход для большинства реакции, делая возможным обрабатывать специальное поле с минимумом боли.