2014-04-02 73 views
-1

我有這樣的JSON飼料解析:深JSON解析在Android

{ 
"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" 
    } 
}, 

我檢索字段標題和梗概是這樣的:

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和mListSynopsis包含了我想要的清單它運作良好。現在,我想檢索我的JSON數組中的一些更深的字段,如「abridget_cast」節點內的演員的「名稱」和最後一個字段「similar」。謝謝你,如果你能幫我做到這一點。

回答

2

嘗試此..

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); 

編輯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()); 
} 

編輯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){} 
      } 
     } 

編輯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); 
2

你可能會更好使用庫:GSON地圖數據和模型類。例如:

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/

命名差異(根據在web服務中的變量),可以使用註釋等@SerializedName。 (所以不需要使用Serializable)

這樣你就可以獲得對象中的所有數據。沒有手動解析它。

根據不同的反應,你的模型類可以是這個樣子:

public class Movies { 

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

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

可以使用每個循環通過多個對象來解析和檢索字段值即可。
http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html
How does the Java 'for each' loop work?

這樣一來,當你有一個精巧的JSON響應,你不需要編寫代碼來手動解析和檢索的字段,你必須來命名類領域的選項(可排除你不需要的)。然後你可以使用它的對象。