Deserializing json from retrofit using jackson where same variable name can represent two different objects

后端 未结 4 1554
有刺的猬
有刺的猬 2021-01-21 09:46

The response from retrofit2 may be of the following types.(and we don\'t know before hand which response will come)

{
    \"id\": \"abc\",
    \"place\": \"LA\",         


        
相关标签:
4条回答
  • 2021-01-21 10:10

    Make some special handling for the driverId field in your response class using the JsonNode class. Something like the following:

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

    This lets you maintain a normal approach for most of the response, while making it possible to handle the special field with a minimum of pain.

    0 讨论(0)
  • 2021-01-21 10:14

    Try this

    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 讨论(0)
  • 2021-01-21 10:20

    You can check whether the json has values inside it;

    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 讨论(0)
  • 2021-01-21 10:28

    You could deserialize to a Map. Afterwards, you could inspect the map and decide to which of the 2 types you convert the map. Take a look at this answer: Deserializing JSON based on object type

    To convert from Map to Object you can use ObjectMapper::convertValue, e.g

     mapper.convertValue(map, Response1.class)
    
    0 讨论(0)
提交回复
热议问题