-1

I have this JSON feed to parse:

 {
"movies": [{
    "id": "770810965",
    "title": "Invictus",
    "year": 2009,
    "mpaa_rating": "PG-13",
    "runtime": 134,
    "critics_consensus": "Delivered with typically stately precision from director Clint Eastwood, Invictus may not be rousing enough for some viewers, but Matt Damon and Morgan Freeman inhabit their real-life characters with admirable conviction.",
    "release_dates": {
        "theater": "2009-12-11",
        "dvd": "2010-05-18"
    },
    "ratings": {
        "critics_rating": "Certified Fresh",
        "critics_score": 76,
        "audience_rating": "Upright",
        "audience_score": 75
    },
    "synopsis": "",
    "posters": {
        "thumbnail": "http://content7.flixster.com/movie/10/92/27/10922777_mob.jpg",
        "profile": "http://content7.flixster.com/movie/10/92/27/10922777_pro.jpg",
        "detailed": "http://content7.flixster.com/movie/10/92/27/10922777_det.jpg",
        "original": "http://content7.flixster.com/movie/10/92/27/10922777_ori.jpg"
    },
    "abridged_cast": [{
        "name": "Morgan Freeman",
        "id": "162652224",
        "characters": ["Nelson Mandela"]
    }, {
        "name": "Matt Damon",
        "id": "162653499",
        "characters": ["Francois Pienaar"]
    }, {
        "name": "Tony Kgoroge",
        "id": "528345122",
        "characters": ["Jason Tshabalala"]
    }, {
        "name": "Patrick Mofokeng",
        "id": "770837270",
        "characters": ["Linga Moonsamy"]
    }, {
        "name": "Matt Stern",
        "id": "770867648",
        "characters": ["Hendrick Booyens"]
    }],
    "alternate_ids": {
        "imdb": "1057500"
    },
    "links": {
        "self": "http://myProjectmobiletest.herokuapp.com/api/public/v1.0/movies/770810965.json",
        "alternate": "http://www.rottentomatoes.com/m/invictus/",
        "cast": "http://myProjectmobiletest.herokuapp.com/api/public/v1.0/movies/770810965/cast.json",
        "clips": "http://myProjectmobiletest.herokuapp.com/api/public/v1.0/movies/770810965/clips.json",
        "reviews": "http://myProjectmobiletest.herokuapp.com/api/public/v1.0/movies/770810965/reviews.json",
        "similar": "http://myProjectmobiletest.herokuapp.com/api/public/v1.0/movies/770810965/similar.json"
    }
},

I retrieve the field title and synopsis like this:

 try{
        jsonResponse = new JSONObject(response);
        JSONArray jsonTitleNode = jsonResponse.optJSONArray("movies");
        lengthJsonArr = jsonTitleNode.length();

        for(int i = 0; i < lengthJsonArr; i++){
            JSONObject jsonChildNode = jsonTitleNode.getJSONObject(i);
            movieTitle = jsonChildNode.optString("title").toString();
            movieSynopsis = jsonChildNode.optString("synopsis").toString();
            mListTitle.add(movieTitle);
            mListSynopsis.add(movieSynopsis);
        }
    }

mListTitle and mListSynopsis contains a list of what I want and it works well. Now, I would like to retrieve some deeper fields inside my JSON array like the "name" of the actors inside the "abridget_cast" node and the last field "similar". Thanks you if you can help me to do this.

Nizar B.
  • 3,098
  • 9
  • 38
  • 56

2 Answers2

2

Try this..

try{

    jsonResponse = new JSONObject(response);
    JSONArray jsonTitleNode = jsonResponse.optJSONArray("movies");
    lengthJsonArr = jsonTitleNode.length();

    for(int i = 0; i < lengthJsonArr; i++){
        JSONObject jsonChildNode = jsonTitleNode.getJSONObject(i);
        movieTitle = jsonChildNode.optString("title").toString();
        movieSynopsis = jsonChildNode.optString("synopsis").toString();
        mListTitle.add(movieTitle);
        mListSynopsis.add(movieSynopsis);

        JSONArray jsoncastarray = jsonChildNode.optJSONArray("abridged_cast");
        for(int j = 0; j < jsoncastarray.length(); j++){
            JSONObject jsoncast = jsoncastarray.getJSONObject(j);
            Log.v("name--",""+jsoncast.optString("name").toString());
            Log.v("id--",""+jsoncast.optString("id").toString());
            JSONArray chararray = jsoncast.optJSONArray("characters");
            for(int k = 0; k < chararray.length(); k++){
                  Log.v("char--",""+chararray.optString(k).toString());
            }
        }
    }
}

EDIT1:

HashMap<String, ArrayList<String>> new_values = new HashMap<String, ArrayList<String>>();
new_values.put(movie id,arraylist of actors name);

EDIT 2:

HashMap<String, ArrayList<String>> new_values = new HashMap<String, ArrayList<String>>();
ArrayList<String> id_list = new ArrayList<String>();
for(int i = 0; i < lengthJsonArr; i++){         
     id_list.add(""+jsonChildNode.optString("id").toString());
     ArrayList<String> actors_list = new ArrayList<String>();
     for(int j = 0; j < jsoncastarray.length(); j++){
         actors_list.add(""+jsoncast.optString("name").toString());
     }
     new_values.put(""+jsonChildNode.optString("id").toString(),actors_list);
}

EDIT 3:

for (Map.Entry<String,ArrayList<String>> entry : new_values.entrySet()) {
       Log.v("Id",""+entry.getKey());
       Log.v("actors_list",""+entry.getValue());
}

EDIT 4:

for(int i = 0; i < lengthJsonArr; i++){
            JSONObject jsonChildNode = jsonMovieNode.getJSONObject(i);
            movieTitle = jsonChildNode.optString(Constants.TAG_TITLE).toString();
            movieSynopsis = jsonChildNode.optString(Constants.TAG_SYNOPSIS).toString();
            id_list.add("" + jsonChildNode.optString("id").toString());
            mListTitle.add(movieTitle);
            mListSynopsis.add(movieSynopsis);

            actors_list = new ArrayList<String>();
            JSONArray jsonCastArray = jsonChildNode.optJSONArray("abridged_cast");
            for(int j = 0; j < jsonCastArray.length(); j++){
            try{
                JSONObject jsonCast = jsonCastArray.getJSONObject(j);
                movieCasting = jsonCast.optString("name").toString();
                actors_list.add(""+jsonCast.optString("name").toString());
                new_values.put(""+jsonChildNode.optString("id").toString(),actors_list);
                mListCasting.add(movieCasting);
            }
            catch (Exception e){}
            }
        }

EDIT 5:

            Intent detailIntent = new Intent(MovieActivity.this, DetailActivity_.class);
            Bundle bundle = new Bundle();
            bundle.putString("title", mListTitle.get(position));
            bundle.putString("synopsis", mListSynopsis.get(position));
            detailIntent.putStringArrayListExtra("casting", actors_list);
            detailIntent.putExtras(bundle);
            startActivity(detailIntent);
Hariharan
  • 24,741
  • 6
  • 50
  • 54
2

You may be better off using a library: Gson to map data and your model classes. Eg.:

Gson gson = new Gson();
ModelClass modelClass= new ModelClass();
modelClass= gson.fromJson(responseContent,ModelClass.class); 
//where responseContent is your jsonString
    Log.i("Web service response", ""+modelClass.toString());

https://code.google.com/p/google-gson/

For Naming discrepancies(according to the variables in webservice), can use annotations like @SerializedName. (So no need to use Serializable)

That way you get all your data in object(s). Without manually parsing it.

Depending on the response, your model class can look something like:

public class Movies {

String id;  
String title;  
Posters posters;  
// other fields & getter,setter
}

public class Posters{
String thumbnail;
//other fields
}

Can Use a for each loop to parse through multiple objects and retrieve your field values then.
http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html
How does the Java 'for each' loop work?

That way, as you have an elaborate json response, you don't need to write code to parse it and retrieve fields manually and you have the option to name the fields in classes(can exclude the ones you don't need). You can then work with its object(s).

Community
  • 1
  • 1
Pararth
  • 8,114
  • 4
  • 34
  • 51