2016-11-08 62 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を心配することなく、既存のものを使って目標を達成することができます。「結果」フィールドは、JSONObjectを含む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

私の経験から、ホイールを2度創り出して、サーバーから取り出したオブジェクトのテンプレートでモデルクラスを作成してから、gsonライブラリ(google 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); 

何uが取得することのアプローチは、この

ようになる項目のいくつかの種類のリストである場合
yourObjectListOfItems= new Gson().fromJson(json,newTypeToken<List<YourObject>>(){}.getType()); 

非常に重要 - それは深さの様々なレベルを囲むので、JSON構造は道がJSONObjectにJSON文字列を変換しようとするだろう、一般的なオブジェクト表現に一致するdoesntの場合atributte名がこの

を動作させるためのJSONハッシュマップのキーと一致する必要がありますまたはJSONArrayに依存し、新しいJSON ****()をtry catchブロックの中に入れて、内部にあると予想されるものに応じてJSONArray、JSONObjectに変換しようとするか、さらに解析して深いレベルに達したと判断します。あなたはGSONライブラリに行くことができる

0

https://github.com/google/gson

まず、アプリのbuild.gradleの依存関係にこれを追加します。

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

に行くより:http://www.jsonschema2pojo.orgとあなたのJSONを貼り付け、適切なオプション(JSON Schema、Gsonなどの代わりにJSON)を選択します。

JSONを表現するために必要なすべてのクラスが用意されています。

例えば、ウェブサイトは、多くのクラスを生成しますが、最初の1は次のようになります。

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

} 

よりは、あなたが使用することができます:あなたのJSONが配列でない

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

ので、ありますオブジェクト。

おそらく、297964アイテムと14899ページがあるため、ページを繰り返し処理する必要があります。

+0

これは既存の回答とどのように違いますか? –

+0

@ cricket_007困ったことがある場合の質問については詳細..別の答えと似ているので、答えを出すことはできませんか?一般的に答えは似ていますね。それは競争ではありません、私が学んでいたときに私は同じ問題を抱えていたので、私は助けようとしています... –

関連する問題