Я создал приложение, которое берет данные о погоде из 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, но он никогда не работал: (