簡體   English   中英

如何從 RestTemplate 將 json 反序列化為單個 object?

[英]How do I deserialize json into a single object from RestTemplate?

我必須使用 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
    }
}

Object 反序列化:

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

在這種情況下如何影響反序列化。 JSON里面有兩個對象,我需要一個?

    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");

感謝若昂迪亞斯。 我制作了自定義反序列化器。 https://www.baeldung.com/jackson-反序列化

就我而言:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM