【问题标题】:How do I deserialize json into a single object from RestTemplate?如何从 RestTemplate 将 json 反序列化为单个对象?
【发布时间】:2022-01-29 09:33:43
【问题描述】:

我必须使用 exchange() 方法,因为我在那里传递 HttpHeaders。

ResponseEntity<WeatherResponse> response Entity = restTemplate.exchange(
weather UrlRequest, Http Method.GET, new HttpEntity<>(headers), WeatherResponse.class);

JSON:

{
    "geoloc": {
         "city": {
             "id": 213,
             "name": "Boston"
         },
         "country": {
             "id": 213,
             "name": "USA"
         },
    "temp": {
         "value": 19.4
    }
}

要反序列化的对象:

class WeahterResponse{
   String country;
   String city;
   float temp;
}

在这种情况下如何影响反序列化。 JSON中有两个对象,我需要一个吗?

【问题讨论】:

标签: java json spring spring-resttemplate


【解决方案1】:
    class WeahterResponse{
       GeoLocation geoloc;
       Map<String,String> temp;
    }
    
    class GeoLocation {
    
    Map<String,Map<String,Object> geoData;
    }
    
    
    It will deserialize your data to WeatherResponse.
    Now if you want to get city data or country Data you can get that as follows.
    suppose json is deserialized into weatherResponse.
    
    Map<String,Map<String,Object> geoData = weatherResponse.getGeoLoc();
    if(!CollectionUtils.isEmpty(geoData)){
    if(geoData.containsKey("city")){
    Map<String,Object> cityData = geoData.get("city");
    System.out.println(cityData.get("id");
    System.out.println(cityData.get("name");
    }
    //same for other keys of geoLoc

    //to get Temp value
    Map<String,String> temp = weatherResponse.getTemp();
   System.out.println(temp.get("value");

【讨论】:

    【解决方案2】:

    感谢若昂·迪亚斯。 我制作了自定义反序列化器。 https://www.baeldung.com/jackson-deserialization

    就我而言:

    public class WeatherDeserializer extends JsonDeserializer<WeatherResponse> {
    
        @Override
        public WeatherResponse deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
            JsonNode nodeTree = jsonParser.getCodec().readTree(jsonParser);
            JsonNode geoObjectNode =  nodeTree.get("geo_object");
            JsonNode factNode = nodeTree.get("fact");
            String country =  geoObjectNode.get("country").get("name").textValue();
            String province =  geoObjectNode.get("province").get("name").textValue();
            String locality = geoObjectNode.get("locality").get("name").textValue();
            GeoObject geoObject = new GeoObject(country, province, locality);
            Short temp = factNode.get("temp").shortValue();
            Long obsTime = factNode.get("uptime").longValue();
            return new WeatherResponse(geoObject,temp,obsTime);
        }
    }
    
    @AllArgsConstructor
    @Getter
    @JsonDeserialize(using = WeatherDeserializer.class)
    public class WeatherResponse {
        private GeoObject geoObject;
        private Short temp;
        private Long uptime;
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2022-01-02
    • 2018-10-11
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多