[英]Deserialize JSON response in Spring 2.7.2
我可以看到很多這類問題,但是通過它們我很難找到答案,並且已經在這個問題上花了幾天時間。 可以使用一些方向來反序列化我收到的響應,以將所需字段拉入可迭代對象中。
API: https://statsapi.web.nhl.com/api/v1/schedule?teamId=55&startDate=2022-10-01&endDate=2023-04-21
對我來說問題是這里有多個級別,我擔心嵌套列表可能是一個問題。 嘗試抓取較低級別的對象繼續為我返回 null。 這是示例 json(上面的完整 output)。
{
"copyright" : "",
...
"metaData" : {
"timeStamp" : "20220723_234058"
},
"wait" : 10,
"dates" : [ {
"date" : "2022-10-12",
...
"games" : [ {
"gamePk" : 2022020009,
...
"status" : {
"abstractGameState" : "Preview",
...
},
"teams" : {
"away" : {
"leagueRecord" : {
"wins" : 0,
...
},
"score" : 0,
"team" : {
"id" : 55,
"name" : "Seattle Kraken",
"link" : "/api/v1/teams/55"
}
},
"home" : {
"leagueRecord" : {
"wins" : 0,
...
},
"score" : 0,
"team" : {
"id" : 24,
"name" : "Anaheim Ducks",
"link" : "/api/v1/teams/24"
}
}
},
"venue" : {
"id" : 5046,
"name" : "Honda Center",
"link" : "/api/v1/venues/5046"
},
"content" : {
"link" : "/api/v1/game/2022020009/content"
}
} ],
"events" : [ ],
"matches" : [ ]
}, ...
我一開始只是試圖在我的 controller 上進行測試,但超出了“游戲”級別,它只是開始為所有內容返回 null。 日期相當容易獲得,但實際的團隊名稱只是導致所有內容都返回為 null。
@GetMapping("/test")
@ResponseBody
public ArrayList<String> teamSchedule(@RequestParam int team) throws JsonProcessingException {
String nhlScheduleAPI = "https://statsapi.web.nhl.com/api/v1/schedule?teamId=";
String nhlScheduleRange = "&startDate=2022-10-01&endDate=2023-04-21";
String teamScheduleURL = nhlScheduleAPI + team + nhlScheduleRange;
RestTemplate restTemplate = new RestTemplate();
JsonNode data = restTemplate.getForObject(teamScheduleURL, JsonNode.class);
ArrayList<String> dates = new ArrayList<>();
data.forEach(game -> {
dates.add(data.get("dates").toString());
});
return dates;
我已經開始創建一個 PoJo class 但是被使用的字段和子類的數量有點不知所措。 我正在嘗試重建我之前在 Python/Django 中創建的計划應用程序,但努力清理來自 api 的數據。 82 場比賽中的每場比賽我只需要三個項目。
[<date>, <home_team>, <away_team>]
有沒有更簡單的方法來做到這一點? 非常感謝這里的任何指導。
如果您正確檢查 Json 節點結構,您將訪問如下日期:
JsonNode data = restTemplate.getForObject(teamScheduleURL, JsonNode.class); data = data.get("dates"); ArrayList<String> dates = new ArrayList<>(); data.forEach(d -> { dates.add(d.get("date").toString()); }); return dates;
為了其他可能需要使用 Java/Spring 學習 Json 或更具體地解析 NHL API 的人,我在下面添加了我的解決方案。 這可能不是減少游戲列表的最佳方式,但它確實有效。 我遇到的問題是沒有很好地理解 Java 如何將 map 分類為嵌套的 json 對象。
時間表POjO
@JsonIgnoreProperties
public class SchedulePOjO {
private ArrayList<DatesPOjO> dates;
// Getters and Setters
}
日期POjO
@JsonIgnoreProperties
public class DatesPOjO {
private ArrayList<GamesPOjO> games;
public ArrayList<GamesPOjO> getGames() {
return games;
// Getters and Setters
}
游戲POjO
@JsonIgnoreProperties
public class GamesPOjO {
private String gameDate;
private TeamsPOjO teams;
// Getters and Setters
}
團隊POjO
@JsonIgnoreProperties
public class TeamsPOjO {
private AwayPOjO away;
private HomePOjO home;
// Getters and Setters
}
離開POJO
@JsonIgnoreProperties
public class AwayPOjO {
private TeamPOjO team;
// Getters and Setters
}
團隊POjO
@JsonIgnoreProperties
public class TeamPOjO {
private int id;
private String name;
private String link;
// Getters and Setters
}
調度控制器
@GetMapping("/test")
@ResponseBody
public SchedulePOjO teamSchedule(@RequestParam int team) throws JsonProcessingException {
// construct url
String nhlScheduleAPI = "https://statsapi.web.nhl.com/api/v1/schedule?teamId=";
String nhlScheduleRange = "&startDate=2022-10-01&endDate=2023-04-21";
String teamScheduleURL = nhlScheduleAPI + team + nhlScheduleRange;
// collect data from restful url
RestTemplate restTemplate = new RestTemplate();
SchedulePOjO schedulePOjO = restTemplate.getForObject(teamScheduleURL, SchedulePOjO.class);
// ObjectMapper mapper = new ObjectMapper();
// SchedulePOjO newdata = mapper.treeToValue(data, SchedulePOjO.class);
return schedulePOjO;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.