简体   繁体   中英

Android Iterating JSON Array containing JSON Object

So i have this code which basically takes a value from JSON array (containing several objects) and assign it appropriately.

// RETRIEVE CAST LIST
JSONArray jCastArr = jObj.getJSONArray("abridged_cast");
Cast person = new Cast();
ArrayList<Cast> castList= new ArrayList<Cast>();

for (int i=0; i < jCastArr.length(); i++) {
    JSONObject jpersonObj = jCastArr.getJSONObject(i);

    person.castId = (String) jpersonObj.getString("id");
    person.castFullName = (String) jpersonObj.getString("name");

    castList.add(person);
}
details.castList = castList;

The JSON value (rotten tomatoes)

{
    "id": 771267761,
    "title": "Riddick",
    "year": 2013,
    "genres": [
        "Action & Adventure",
        "Science Fiction & Fantasy"
    ],
    "mpaa_rating": "R",
    "runtime": 119,
    "critics_consensus": "It may not win the franchise many new converts, but this back-to-basics outing brings Riddick fans more of the brooding sci-fi action they've come to expect.",
    "release_dates": {
        "theater": "2013-09-06"
    },
    "ratings": {
        "critics_rating": "Rotten",
        "critics_score": 57,
        "audience_rating": "Upright",
        "audience_score": 66
    },
    "synopsis": "Blah.....",
    "posters": {
        "thumbnail": "http://content8.flixster.com/movie/11/17/20/11172082_mob.jpg",
        "profile": "http://content8.flixster.com/movie/11/17/20/11172082_pro.jpg",
        "detailed": "http://content8.flixster.com/movie/11/17/20/11172082_det.jpg",
        "original": "http://content8.flixster.com/movie/11/17/20/11172082_ori.jpg"
    },
    "abridged_cast": [
        {
            "name": "Vin Diesel",
            "id": "162652472",
            "characters": [
                "Riddick"
            ]
        },
        {
            "name": "Karl Urban",
            "id": "162654704",
            "characters": [
                "Vaako"
            ]
        },
        {
            "name": "Jordi Molla",
            "id": "364617086",
            "characters": [
                "Santana"
            ]
        },
        {
            "name": "Matt Nable",
            "id": "771069067",
            "characters": [
                "Boss Johns"
            ]
        },
        {
            "name": "Katee Sackhoff",
            "id": "459518520",
            "characters": [
                "Dahl"
            ]
        }
    ],
    "abridged_directors": [
        {
            "name": "David Twohy"
        }
    ],
    "studio": "Universal Classics",
    "alternate_ids": {
        "imdb": "1411250"
    },
    "links": {
        "self": "http://api.rottentomatoes.com/api/public/v1.0/movies/771267761.json",
        "alternate": "http://www.rottentomatoes.com/m/riddick/",
        "cast": "http://api.rottentomatoes.com/api/public/v1.0/movies/771267761/cast.json",
        "clips": "http://api.rottentomatoes.com/api/public/v1.0/movies/771267761/clips.json",
        "reviews": "http://api.rottentomatoes.com/api/public/v1.0/movies/771267761/reviews.json",
        "similar": "http://api.rottentomatoes.com/api/public/v1.0/movies/771267761/similar.json"
    }
}

The problem is when i call it like such

ArrayList<Cast> list = details.castList;
Cast actor = list.get(0);
String temp = actor.castFullName;
longToast(temp);

It will always return Katee Sackhoff (no matter what index position it is). I've tried to iterate it using for loops, but i just want to keep it simple for debugging purposes.

You are using the same Cast object for every entry.
On each iteration you just changed the same object instead creating a new one.

This code should fix it:

JSONArray jCastArr = jObj.getJSONArray("abridged_cast");
ArrayList<Cast> castList= new ArrayList<Cast>();

for (int i=0; i < jCastArr.length(); i++) {
    Cast person = new Cast();  // create a new object here
    JSONObject jpersonObj = jCastArr.getJSONObject(i);

    person.castId = (String) jpersonObj.getString("id");
    person.castFullName = (String) jpersonObj.getString("name");

    castList.add(person);
}
details.castList = castList;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM