Kanishka Ganguly
Kanishka Ganguly

Reputation: 1298

JSON Parsing using minimal-json and Gson

I have a java program which retrieves data for a particular TV show and returns a JSON response with the details. My problem is with parsing the JSON response to get one particular key-value pair, namely the "first_aired_iso" string, which gives the air date for that episode.

Here is the URL which calls the API

String api_url = "http://api.trakt.tv/show/season.json/<api-key>/the-walking-dead/1";

And here is the corresponding JSON response


! [ { "season":1, "episode":1, "number":1, "tvdb_id":2493011, "title":"Days Gone Bye", "overview":"Rick searches for his family after emerging from a coma into a world terrorized by the walking dead. Morgan and Duane, whom he meets along the way, help teach Rick the new rules for survival.", "first_aired":1288584000, "first_aired_iso":"2010-10-31T21:00:00-05:00", "first_aired_utc":1288598400, "url":"http://trakt.tv/show/the-walking-dead/season/1/episode/1", "screen":"http://slurm.trakt.us/images/episodes/124-1-1.22.jpg", "images":{ "screen":"http://slurm.trakt.us/images/episodes/124-1-1.22.jpg" }, "ratings":{ "percentage":89, "votes":763, "loved":733, "hated":30 }, "watched":true, "in_collection":true, "in_watchlist":false, "rating":false, "rating_advanced":0 }, { "season":1, "episode":2, "number":2, "tvdb_id":2493181, "title":"Guts", "overview":"Rick unknowingly causes a group of survivors to be trapped by walkers. The group dynamic devolves from accusations to violence, as Rick must confront an enemy far more dangerous than the undead.", "first_aired":1289192400, "first_aired_iso":"2010-11-07T21:00:00-06:00", "first_aired_utc":1289210400, "url":"http://trakt.tv/show/the-walking-dead/season/1/episode/2", "screen":"http://slurm.trakt.us/images/episodes/124-1-2.22.jpg", "images":{ "screen":"http://slurm.trakt.us/images/episodes/124-1-2.22.jpg" }, "ratings":{ "percentage":87, "votes":533, "loved":507, "hated":26 }, "watched":true, "in_collection":true, "in_watchlist":false, "rating":false, "rating_advanced":0 }, { "season":1, "episode":3, "number":3, "tvdb_id":2656081, "title":"Tell It to the Frogs", "overview":"After returning to the camp with the department store survivors and an emotional reunion with his wife and son, Rick decides to go against Shane's advice and go back to Atlanta for Merle Dixon and his dropped bag of guns accompanied by Merle's younger brother, Darryl Dixon, as well as Glenn and T-Dog.", "first_aired":1289797200, "first_aired_iso":"2010-11-14T21:00:00-06:00", "first_aired_utc":1289815200, "url":"http://trakt.tv/show/the-walking-dead/season/1/episode/3", "screen":"http://slurm.trakt.us/images/episodes/124-1-3.22.jpg", "images":{ "screen":"http://slurm.trakt.us/images/episodes/124-1-3.22.jpg" }, "ratings":{ "percentage":85, "votes":484, "loved":458, "hated":26 }, "watched":true, "in_collection":true, "in_watchlist":false, "rating":false, "rating_advanced":0 }, { "season":1, "episode":4, "number":4, "tvdb_id":2656091, "title":"Vatos", "overview":"While still in search of Merle, the group tries to retrieve the bag of guns but are attacked by several living men who are also after the weapons. The group manages to grab the injured attacker; however, several of the attackers escape and take Glenn hostage. Back at camp a large group of walkers venture up the hill and take the survivors by surprise.", "first_aired":1290402000, "first_aired_iso":"2010-11-21T21:00:00-06:00", "first_aired_utc":1290420000, "url":"http://trakt.tv/show/the-walking-dead/season/1/episode/4", "screen":"http://slurm.trakt.us/images/episodes/124-1-4.22.jpg", "images":{ "screen":"http://slurm.trakt.us/images/episodes/124-1-4.22.jpg" }, "ratings":{ "percentage":88, "votes":490, "loved":467, "hated":23 }, "watched":true, "in_collection":true, "in_watchlist":false, "rating":false, "rating_advanced":0 }, { "season":1, "episode":5, "number":5, "tvdb_id":2656101, "title":"Wildfire", "overview":"Rick leads the group to the CDC after the attack on the camp. Jim must make a terrible life and death decision.", "first_aired":1291006800, "first_aired_iso":"2010-11-28T21:00:00-06:00", "first_aired_utc":1291024800, "url":"http://trakt.tv/show/the-walking-dead/season/1/episode/5", "screen":"http://slurm.trakt.us/images/episodes/124-1-5.22.jpg", "images":{ "screen":"http://slurm.trakt.us/images/episodes/124-1-5.22.jpg" }, "ratings":{ "percentage":87, "votes":460, "loved":443, "hated":17 }, "watched":true, "in_collection":true, "in_watchlist":false, "rating":"love", "rating_advanced":10 }, { "season":1, "episode":6, "number":6, "tvdb_id":2656111, "title":"TS-19", "overview":"Rick and the group are allowed into the CDC by a strange doctor, but all is not what it seems in their newfound haven. ", "first_aired":1291611600, "first_aired_iso":"2010-12-05T21:00:00-06:00", "first_aired_utc":1291629600, "url":"http://trakt.tv/show/the-walking-dead/season/1/episode/6", "screen":"http://slurm.trakt.us/images/episodes/124-1-6.22.jpg", "images":{ "screen":"http://slurm.trakt.us/images/episodes/124-1-6.22.jpg" }, "ratings":{ "percentage":87, "votes":465, "loved":440, "hated":25 }, "watched":true, "in_collection":true, "in_watchlist":false, "rating":"love", "rating_advanced":10 } ]


Well, you get the idea... I just need to extract the key value for "first_aired_iso" for each episode.

Here is my code to do that

        String s = response.toString();
        Gson gson = new Gson();
        String jsonstr = gson.toJson(s);
        System.out.println(jsonstr);
        JsonArray json = JsonArray.readFrom(jsonstr);
        for (int i = 0; i < 15; i++) {
            System.out.println(json.get(i).asString());
        }

Problem is, there is absolutely no response after printing the raw JSON output. I can't get it to enter the loop at all.

For reference, please check http://eclipsesource.com/blogs/2013/04/18/minimal-json-parser-for-java/

Upvotes: 2

Views: 3019

Answers (2)

Kanishka Ganguly
Kanishka Ganguly

Reputation: 1298

String s = response.toString();
JsonArray json = JsonArray.readFrom(s);
for (int i = 0; i < json.size(); i++) {
    JsonObject show = json.get(i).asObject();
    int episode = show.get("episode").asInt();
    String time = show.get("first_aired_iso").asString();
    System.out.println("Episode " + episode + " - " + time);
}

Thanks a lot HotLicks! :)

Upvotes: 0

giampaolo
giampaolo

Reputation: 6934

My solution:

public static void main(String[] args) {
    String json = "[ { \"season\":1, \"episode\":1, \"number\":1, \"tvdb_id\":2493011, \"title\":\"Days Gone Bye\", \"overview\":\"Rick searches for his family after emerging from a coma into a world terrorized by the walking dead. Morgan and Duane, whom he meets along the way, help teach Rick the new rules for survival.\", \"first_aired\":1288584000, \"first_aired_iso\":\"2010-10-31T21:00:00-05:00\", \"first_aired_utc\":1288598400, \"url\":\"http://trakt.tv/show/the-walking-dead/season/1/episode/1\", \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-1.22.jpg\", \"images\":{ \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-1.22.jpg\" }, \"ratings\":{ \"percentage\":89, \"votes\":763, \"loved\":733, \"hated\":30 }, \"watched\":true, \"in_collection\":true, \"in_watchlist\":false, \"rating\":false, \"rating_advanced\":0 }, { \"season\":1, \"episode\":2, \"number\":2, \"tvdb_id\":2493181, \"title\":\"Guts\", \"overview\":\"Rick unknowingly causes a group of survivors to be trapped by walkers. The group dynamic devolves from accusations to violence, as Rick must confront an enemy far more dangerous than the undead.\", \"first_aired\":1289192400, \"first_aired_iso\":\"2010-11-07T21:00:00-06:00\", \"first_aired_utc\":1289210400, \"url\":\"http://trakt.tv/show/the-walking-dead/season/1/episode/2\", \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-2.22.jpg\", \"images\":{ \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-2.22.jpg\" }, \"ratings\":{ \"percentage\":87, \"votes\":533, \"loved\":507, \"hated\":26 }, \"watched\":true, \"in_collection\":true, \"in_watchlist\":false, \"rating\":false, \"rating_advanced\":0 }, { \"season\":1, \"episode\":3, \"number\":3, \"tvdb_id\":2656081, \"title\":\"Tell It to the Frogs\", \"overview\":\"After returning to the camp with the department store survivors and an emotional reunion with his wife and son, Rick decides to go against Shane's advice and go back to Atlanta for Merle Dixon and his dropped bag of guns accompanied by Merle's younger brother, Darryl Dixon, as well as Glenn and T-Dog.\", \"first_aired\":1289797200, \"first_aired_iso\":\"2010-11-14T21:00:00-06:00\", \"first_aired_utc\":1289815200, \"url\":\"http://trakt.tv/show/the-walking-dead/season/1/episode/3\", \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-3.22.jpg\", \"images\":{ \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-3.22.jpg\" }, \"ratings\":{ \"percentage\":85, \"votes\":484, \"loved\":458, \"hated\":26 }, \"watched\":true, \"in_collection\":true, \"in_watchlist\":false, \"rating\":false, \"rating_advanced\":0 }, { \"season\":1, \"episode\":4, \"number\":4, \"tvdb_id\":2656091, \"title\":\"Vatos\", \"overview\":\"While still in search of Merle, the group tries to retrieve the bag of guns but are attacked by several living men who are also after the weapons. The group manages to grab the injured attacker; however, several of the attackers escape and take Glenn hostage. Back at camp a large group of walkers venture up the hill and take the survivors by surprise.\", \"first_aired\":1290402000, \"first_aired_iso\":\"2010-11-21T21:00:00-06:00\", \"first_aired_utc\":1290420000, \"url\":\"http://trakt.tv/show/the-walking-dead/season/1/episode/4\", \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-4.22.jpg\", \"images\":{ \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-4.22.jpg\" }, \"ratings\":{ \"percentage\":88, \"votes\":490, \"loved\":467, \"hated\":23 }, \"watched\":true, \"in_collection\":true, \"in_watchlist\":false, \"rating\":false, \"rating_advanced\":0 }, { \"season\":1, \"episode\":5, \"number\":5, \"tvdb_id\":2656101, \"title\":\"Wildfire\", \"overview\":\"Rick leads the group to the CDC after the attack on the camp. Jim must make a terrible life and death decision.\", \"first_aired\":1291006800, \"first_aired_iso\":\"2010-11-28T21:00:00-06:00\", \"first_aired_utc\":1291024800, \"url\":\"http://trakt.tv/show/the-walking-dead/season/1/episode/5\", \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-5.22.jpg\", \"images\":{ \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-5.22.jpg\" }, \"ratings\":{ \"percentage\":87, \"votes\":460, \"loved\":443, \"hated\":17 }, \"watched\":true, \"in_collection\":true, \"in_watchlist\":false, \"rating\":\"love\", \"rating_advanced\":10 }, { \"season\":1, \"episode\":6, \"number\":6, \"tvdb_id\":2656111, \"title\":\"TS-19\", \"overview\":\"Rick and the group are allowed into the CDC by a strange doctor, but all is not what it seems in their newfound haven. \", \"first_aired\":1291611600, \"first_aired_iso\":\"2010-12-05T21:00:00-06:00\", \"first_aired_utc\":1291629600, \"url\":\"http://trakt.tv/show/the-walking-dead/season/1/episode/6\", \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-6.22.jpg\", \"images\":{ \"screen\":\"http://slurm.trakt.us/images/episodes/124-1-6.22.jpg\" }, \"ratings\":{ \"percentage\":87, \"votes\":465, \"loved\":440, \"hated\":25 }, \"watched\":true, \"in_collection\":true, \"in_watchlist\":false, \"rating\":\"love\", \"rating_advanced\":10 } ]";
    ArrayList<Map> al = new Gson().fromJson(json, ArrayList.class);
    for(Map m : al){
        System.out.printf("Ep. %.0f aired on %s\n", m.get("episode"),  m.get("first_aired_iso"));
    }
}

This is the execution:

1 aired on 2010-10-31T21:00:00-05:00
2 aired on 2010-11-07T21:00:00-06:00
3 aired on 2010-11-14T21:00:00-06:00
4 aired on 2010-11-21T21:00:00-06:00
5 aired on 2010-11-28T21:00:00-06:00
6 aired on 2010-12-05T21:00:00-06:00

You should always let Gson do the work for you. In this case you have an list of objects (map). So tell Gson to deserialize in that way and access to the structure using generic for loop and map access.

Upvotes: 1

Related Questions