gpt4 book ai didi

java - ClimaCell API json 转换为 POJO

转载 作者:行者123 更新时间:2023-12-01 16:28:58 24 4
gpt4 key购买 nike

我创建了一个应用程序,它从 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
}
]

然后我为这个 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();
}
}

所有类(class)都具有

 @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(对于第一次这样做的人来说这是一个困难的情况 - this may be helpful ),然后我使用 gson 将 JSON 转换为我自己的类

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

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

仅此而已:)

关于java - ClimaCell API json 转换为 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62087036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com