簡體   English   中英

在 Spring 2.7.2 中反序列化 JSON 響應

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM