ClimaCell API json casting to POJO



我创建了一个应用程序,该应用程序从ClimaCell API获取天气数据,然后将其显示在页面上。下面我将展示它的外观。首先,邮递员在发送查询后给出这样的结果:

[
{
"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
}
]

然后我为这个 json 创建了 POJO,它看起来像这样:

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 类上,但它从未:(

最后我解决了这个问题。首先,你需要创建一个好的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());

这就是:)

最新更新