ClimaCell API json преобразование в POJO - PullRequest
0 голосов
/ 29 мая 2020

Я создал приложение, которое берет данные о погоде из ClimaCell API и затем отображает их на странице. Ниже я покажу, как это выглядит. Сначала Postman дает такие результаты после отправки запроса:

[
   {
      "temp":[
         {
            "observation_time":"2020-05-30T03:00:00Z",
            "min":{
               "value":13.49,
               "units":"C"
            }
         },
         {
            "observation_time":"2020-05-29T14:00:00Z",
            "max":{
               "value":28.15,
               "units":"C"
            }
         }
      ],
      "precipitation":[
         {
            "observation_time":"2020-05-29T07:00:00Z",
            "max":{
               "value":0,
               "units":"mm/hr"
            }
         }
      ],
      "feels_like":[
         {
            "observation_time":"2020-05-30T03:00:00Z",
            "min":{
               "value":13.49,
               "units":"C"
            }
         },
         {
            "observation_time":"2020-05-29T14:00:00Z",
            "max":{
               "value":26.8,
               "units":"C"
            }
         }
      ],
      "humidity":[
         {
            "observation_time":"2020-05-29T13:00:00Z",
            "min":{
               "value":18.1,
               "units":"%"
            }
         },
         {
            "observation_time":"2020-05-30T03:00:00Z",
            "max":{
               "value":80.4,
               "units":"%"
            }
         }
      ],
      "baro_pressure":[
         {
            "observation_time":"2020-05-29T15:00:00Z",
            "min":{
               "value":998.21,
               "units":"hPa"
            }
         },
         {
            "observation_time":"2020-05-29T07:00:00Z",
            "max":{
               "value":1001.36,
               "units":"hPa"
            }
         }
      ],
      "wind_speed":[
         {
            "observation_time":"2020-05-29T09:00:00Z",
            "min":{
               "value":3.1,
               "units":"m/s"
            }
         },
         {
            "observation_time":"2020-05-29T16:00:00Z",
            "max":{
               "value":8.98,
               "units":"m/s"
            }
         }
      ],
      "visibility":[
         {
            "observation_time":"2020-05-29T08:00:00Z",
            "min":{
               "value":24.13,
               "units":"km"
            }
         },
         {
            "observation_time":"2020-05-29T15:00:00Z",
            "max":{
               "value":24.14,
               "units":"km"
            }
         }
      ],
      "observation_time":{
         "value":"2020-05-29"
      },
      "lat":30,
      "lon":30
   }
]

Затем я создал POJO для этого json, который выглядит так:

public class ClimaCell {
 @SerializedName("temp")
 @Expose
 private List<Values> temp = new ArrayList<>();

 @SerializedName("precipitation")
 @Expose
 private List<Values> precipitation = new ArrayList<>();

 @SerializedName("feels_like")
 @Expose
 private List<Values> feelsLike = new ArrayList<>();

 @SerializedName("humidity")
 @Expose
 private List<Values> humidity = new ArrayList<>();

 @SerializedName("baro_pressure")
 @Expose
 private List<Values> baroPressure = new ArrayList<>();

 @SerializedName("wind_speed")
 @Expose
 private List<Values> windSpeed = new ArrayList<>();

 @SerializedName("visibility")
 @Expose
 private List<Values> visibility = new ArrayList<>();

 @SerializedName("observation_time")
 @Expose
 private List<ObservationTime> observationTime = new ArrayList<>();

 @SerializedName("lat")
 @Expose
 private Double lat;

 @SerializedName("lon")
 @Expose
 private Double lon;
}

public class Values {
 @SerializedName("observation_time")
 @Expose
 private String observationTime;

 private LinkedHashMap<String, LinkedHashMap<String, String>> storage;

 @Override
 public String toString() {
    return new ToStringBuilder(this).append("observationTime", observationTime).append("storage", 
                                                                             storage).toString();
 }
}

public class ObservationTime {
 @SerializedName("value")
 @Expose
 private String value;

 @Override
 public String toString() {
    return new ToStringBuilder(this).append("value", value).toString();
 }
}

Все классы с

 @Getter
 @Setter
 @NoArgsConstructor
 @AllArgsConstructor

После выполнения этого кода:

    Object quote = restTemplate.getForObject(url, Object.class);
    var list = (List<ClimaCell>) quote;

    System.out.println(list.get(0).getTemp().get(0).getStorage().get("min").get("value"));

Список переменных и цитата выглядят так

list = {ArrayList@7179}  size = 1
 0 = {LinkedHashMap@7947}  size = 10
  "temp" -> {ArrayList@7955}  size = 2
   key = "temp"
   value = {ArrayList@7955}  size = 2
    0 = {LinkedHashMap@7957}  size = 2
     "observation_time" -> "2020-05-30T03:00:00Z"
      key = "observation_time"
      value = "2020-05-30T03:00:00Z"
     "min" -> {LinkedHashMap@7970}  size = 2
      key = "min"
      value = {LinkedHashMap@7970}  size = 2
    1 = {LinkedHashMap@7981}  size = 2
     "observation_time" -> "2020-05-29T13:00:00Z"
      key = "observation_time"
      value = "2020-05-29T13:00:00Z"
     "max" -> {LinkedHashMap@7994}  size = 2
      key = "max"
      value = {LinkedHashMap@7994}  size = 2
  "precipitation" -> {ArrayList@8009}  size = 1
   key = "precipitation"
   value = {ArrayList@8009}  size = 1
    0 = {LinkedHashMap@8011}  size = 2
     "observation_time" -> "2020-05-29T23:00:00Z"
      key = "observation_time"
      value = "2020-05-29T23:00:00Z"
     "max" -> {LinkedHashMap@8023}  size = 2
      key = "max"
      value = {LinkedHashMap@8023}  size = 2
       "value" -> {Double@8065} 0.0625
       "units" -> "mm/hr"
  "feels_like" -> {ArrayList@8068}  size = 2 //it looks like the above
  "humidity" -> {ArrayList@8070}  size = 2  //same
  "baro_pressure" -> {ArrayList@8072}  size = 2  //...
  "wind_speed" -> {ArrayList@8074}  size = 2
  "visibility" -> {ArrayList@8076}  size = 2
  "observation_time" -> {LinkedHashMap@8077}  size = 1
   key = "observation_time"
   value = {LinkedHashMap@8077}  size = 1
    "value" -> "2020-05-29"
  "lat" -> {Double@8050} 52.237049 //until this
  "lon" -> {Double@8079} 21.017532

и консоль возвращает такую ​​ошибку

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class 
    com.weathernow.web.model.ClimaCell (java.util.LinkedHashMap is in module java.base of loader 
    'bootstrap'; com.weathernow.web.model.ClimaCell is in unnamed module of loader 'app')
         at com.weathernow.web.Service.ClimaCellService.getDailyForecast(ClimaCellService.java:42) ~ 
    [classes/:na]
         at 
       com.weathernow.web.Controller.HomeController.getHomePageWithForecast(HomeController.java:21) ~ 
    [classes/:na]

Может ли кто-нибудь помочь мне с этим? Я пробовал разными способами применить этот список к классу ClimaCell, но он никогда не работал: (

1 Ответ

0 голосов
/ 30 мая 2020

Наконец я решил эту проблему. Во-первых, вам нужно создать хороший POJO (это был трудный случай для кого-то, кто делал это впервые - это может быть полезно ), затем я использовал gson для преобразования JSON в свой собственный класс

String quote = restTemplate.getForObject(url, String.class);

Gson gson = new Gson();
List<ClimaCell> pojo = gson.fromJson(quote, new TypeToken<List<ClimaCell>>() {}.getType());

И все :)

...