2016-11-08 139 views
-1

我在爲大學分配工作中使用TheMovieDB API,並且我很難理解如何從嵌套的JSON文件格式訪問值。如何從嵌套的JSON文件中檢索數據

下面是對文件的鏈接,我嘗試使用: https://api.themoviedb.org/3/discover/movie?api_key=822b6a3af922b0c70d5455e2d2e0f782&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=true&page=1

目前,我的代碼如下所示:

httpConnect jParser = new httpConnect(); 
String json = jParser.getJSONFromUrl(url); 
jsonData = json.toString(); 

JSONObject json1obj = new JSONObject(json); 
JSONArray json1arr = json1obj.getJSONArray("results"); 
String jsonResults = json1arr.toString(); 

JSONObject first = new JSONArray(jsonResults).getJSONObject(0); 
JSONArray second = first.getJSONArray("poster_path"); 
String secondString = second.toString(); 

poster_path = secondString.toString(); 

我能夠進入第一層(「結果「)但我遇到麻煩比這更深。總體目標是訪問「poster_path」對象。我是Java和JSON的新手,所以這可能看起來像一個愚蠢的問題。任何幫助表示讚賞:)

+0

'json1arr'是一個數組。你需要使用'for'循環。 –

回答

0

GSON非常實用且簡單,我一定會推薦它用於任何長期/可重複使用的項目。但是,您可以使用已有的東西實現目標,而無需擔心POJO。「result」字段是一個包含JSONObjects的JSONArray。因此,循環遍歷每個JSONObject,並從那裏拉出'poster_path'字符串。而且,爲了澄清,「poster_path」字段是一個字符串,而不是一個對象。如果你需要海報路徑,你可以使用這樣的東西。方法名稱可能不完全相同,但它們應該相似。我冒昧地縮短了你在那裏的一些東西。

httpConnect jParser = new httpConnect(); 
JSONObject json1obj = new JSONObject(jParser.getJSONFromUrl(url)); 
JSONArray json1arr = json1obj.getJSONArray("results"); 
List<String> posterPaths = new ArrayList<String>(json1arr.length()); 
for (int i = 0 ; i < json1arr.length(); i++) { 
    JSONObject ithObject = json1arr.getJSONObject(i); 
    // if necessary, check to make sure the key 'poster_path' exists 
    if (ithObject.has("poster_path")) { 
     posterPaths.add(ithObject.getString("poster_path")); 
    } 
} 

// as an example usage, loop through the list and print each poster path 
for (String posterPath : posterPaths) { 
    System.out.println(posterPath); 
} 

我看到寫POJO和創造一個更強大的解決方案的價值,但是這可能是開始,因爲你是新來的Java/JSON的好地方。

+0

謝謝!每個人的回答都很棒,但這正是我想要的,並且只需最少量的代碼:) – Jack

0

從我的經驗,不要試圖發明輪兩次,創建一個模型類與您從服務器檢索的對象atribut,然後導入gson庫(谷歌json解析庫),將此添加到您的構建gradle這個文件 - >編譯「com.google.code.gson:GSON:2.7」

public class YourObject(){ 

    String id; 
    String property; 

public YourObject(){} 

//Getter & Setter 

} 

Gson gson = new Gson(); 
YourObject item = gson.fromJson(json,YourObject.class); 

如果妳想要獲取什麼方法將是這樣

某種物品的列表
yourObjectListOfItems= new Gson().fromJson(json,newTypeToken<List<YourObject>>(){}.getType()); 

非常重要 - 在atributte名稱必須這樣做的JSON HashMap的密鑰相匹配的工作

如果JSON結構犯規匹配的典型對象表示,因爲它圍住各個層面深度的方式將試圖JSON字符串轉換成的JSONObject或JSONArray取決於並將新的JSON ****()放入try catch塊中,並取決於您期望在裏面嘗試轉換爲JSONArray,JSONObject還是決定您已達到最深層次,以至於無法進一步解析。

0

您可以與GSON庫(https://github.com/google/gson

第一次去,將它添加到您的應用程序的build.gradle依賴關係:

'com.google.code.gson:gson:2.8.0'

比,請訪問:http://www.jsonschema2pojo.org並粘貼JSON,選擇正確的選項(JSON而不是JSON Schema,Gson等)。

您將獲得代表JSON所需的所有類。

例如,網站會生成很多類,但第一個是:

public class RootClass { 

@SerializedName("page") 
@Expose 
private Integer page; 
@SerializedName("results") 
@Expose 
private List<Result> results = new ArrayList<Result>(); 
@SerializedName("total_results") 
@Expose 
private Integer totalResults; 
@SerializedName("total_pages") 
@Expose 
private Integer totalPages; 

/** 
* 
* @return 
* The page 
*/ 
public Integer getPage() { 
return page; 
} 

/** 
* 
* @param page 
* The page 
*/ 
public void setPage(Integer page) { 
this.page = page; 
} 

/** 
* 
* @return 
* The results 
*/ 
public List<Result> getResults() { 
return results; 
} 

/** 
* 
* @param results 
* The results 
*/ 
public void setResults(List<Result> results) { 
this.results = results; 
} 

/** 
* 
* @return 
* The totalResults 
*/ 
public Integer getTotalResults() { 
return totalResults; 
} 

/** 
* 
* @param totalResults 
* The total_results 
*/ 
public void setTotalResults(Integer totalResults) { 
this.totalResults = totalResults; 
} 

/** 
* 
* @return 
* The totalPages 
*/ 
public Integer getTotalPages() { 
return totalPages; 
} 

/** 
* 
* @param totalPages 
* The total_pages 
*/ 
public void setTotalPages(Integer totalPages) { 
this.totalPages = totalPages; 
} 

} 

比,你可以使用:

Gson gson = new Gson(); 
RootClass item = gson.fromJson(json, RootClass.class); 

因爲你的JSON是不是一個數組,是一個對象。

但可能你需要迭代頁面,因爲有297964項和14899頁!

+0

這與現有答案有何不同? –

+0

@ cricket_007這是詳細的問題,以防萬一他有困難..我不能嘗試只是因爲與另一個給定的答案類似的答案嗎?一般的答案是相似的,你不覺得嗎?這不是一場比賽,我想幫忙,因爲我在學習時遇到同樣的問題... –