Home > OS >  Deserialize JSON response in Spring 2.7.2
Deserialize JSON response in Spring 2.7.2

Time:07-25

I can see heaps of these sorts of questions but looking through them I'm struggling to find the answer and have already spent a couple days on this issue. Could use some direction for deserializing a response I am receiving to pull the required fields into an iterable.

API: https://statsapi.web.nhl.com/api/v1/schedule?teamId=55&startDate=2022-10-01&endDate=2023-04-21

Problem for me is there are multiple levels here and I'm concerned the nested lists might be an issue. Trying to grab lower level objects continues to return a null for me. This is the example json (full output above).

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

I started by just trying to slice it up on my controller for testing but going beyond the 'games' level it just starts returning null for everything. Dates were fairly easy enough to get but the actual team names just resulted in everything being returned as 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;

I've started to create a PoJo class but a bit overwhelmed by the number of fields and sub-classes being used. I am attempting to rebuild a schedule app that I previously created in Python/Django but struggling to sanitize the data from the api. I'm only needing three items for each of the 82 games.

[<date>, <home_team>, <away_team>]

Is there an easier way to do this? Really appreciate any guidance here.

CodePudding user response:

If you inspect the Json node structure correctly you would access the dates like this:

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;

CodePudding user response:

For the sake of others who may be in need of learning Json with Java/Spring, or more specifically parsing the NHL API, I am adding my solution below. It likely isn't the best way to achieve a reduced list of games but it works. The problem I was having through this was not having a good understanding of how Java classes map to nested json objects.

SchedulePOjO

@JsonIgnoreProperties
public class SchedulePOjO  {

    private ArrayList<DatesPOjO> dates;

    // Getters and Setters
}

DatesPOjO

@JsonIgnoreProperties
public class DatesPOjO {

    private ArrayList<GamesPOjO> games;

    public ArrayList<GamesPOjO> getGames() {
        return games;

// Getters and Setters
    }

GamesPOjO

@JsonIgnoreProperties
public class GamesPOjO {

    private String gameDate;
    private TeamsPOjO teams;

    // Getters and Setters
}

TeamsPOjO

@JsonIgnoreProperties
public class TeamsPOjO {

    private AwayPOjO away;
    private HomePOjO home;

    // Getters and Setters
}

AwayPOjO

@JsonIgnoreProperties
public class AwayPOjO {

    private TeamPOjO team;

    // Getters and Setters
}

TeamPOjO

@JsonIgnoreProperties
public class TeamPOjO {

    private int id;
    private String name;
    private String link;

    // Getters and Setters
}

ScheduleController

@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;
  • Related