2011-07-11 7 views
1

良い一日の人々。 このJSON結果はhttp://pastebin.com/9psYCfGjです。 そして、最初の2つの背景を取得したい(607行目から開始)。JSONからのデータの取得

だから私はw1280のサイズ(ライン639) そしてw1280のサイズ(ライン680)を有する第二背景のURLを持つ最初の背景のURLを取得したい

どのように私だけになるだろうこれらの2つのURL

おかげ トム

+0

サービスURLを投稿できますか?どこからデータを取得しましたか? –

答えて

0

に元の質問でJSONが800を超えていた例を願っていますライン。ここでは、同じ構造を保持するトリムされたバージョンがあります(ただし、50行ではまだ長くあります)。

[ 
    { 
     "id": 17529, 
     "name": "True Grit", 
     "posters": [ 
      { 
       "image": { 
        "type": "poster", 
        "size": "original", 
        "height": 1500, 
        "width": 1000, 
        "url": "http://cf1.imgobject.com/posters/0be/4db5f8e65e73d67a840070be/true-grit-original.jpg", 
        "id": "4db5f8e65e73d67a840070be" 
       } 
      }, 
      { 
       "image": { 
        "type": "poster", 
        "size": "w154", 
        "height": 211, 
        "width": 154, 
        "url": "http://cf1.imgobject.com/posters/284/4d559bb87b9aa15cf6001284/true-grit-w154.jpg", 
        "id": "4d559bb87b9aa15cf6001284" 
       } 
      } 
     ], 
     "backdrops": [ 
      { 
       "image": { 
        "type": "backdrop", 
        "size": "w1280", 
        "height": 720, 
        "width": 1280, 
        "url": "http://cf1.imgobject.com/backdrops/900/4d33ccea7b9aa177db007900/true-grit-w1280.jpg", 
        "id": "4d33ccea7b9aa177db007900" 
       } 
      }, 
      { 
       "image": { 
        "type": "backdrop", 
        "size": "w1280", 
        "height": 720, 
        "width": 1280, 
        "url": "http://cf1.imgobject.com/backdrops/01f/4c90088b5e73d61ee900001f/true-grit-w1280.jpg", 
        "id": "4c90088b5e73d61ee900001f" 
       } 
      } 
     ] 
    } 
] 

としては、既に単純なアプローチは、Javaデータ構造にJSONをデシリアライズし、次にターゲットデータを選択するためにJava構造を反復処理するGsonを使用することで、提案しました。あるいは、xpathのような選択クエリが単にターゲットデータを引き出すことを可能にする少なくとも2つのJava-to-JSONライブラリが存在しますが、それらはJSONを読み取るための他のJavaライブラリと比べて非常に遅く、それでもコミュニティの利用とサポートがたくさんあるので、私はそれらをお勧めしません。いずれにしても、Gsonやその他のJava/JSONライブラリを使用する場合でも、行番号以外の選択基準を決定することはうまくいきます。

選択の目標には、最初の2つの背景のURLがw1280のサイズであると仮定して、Gsonを使用して達成する例を次に示します。

JSON構造が単一のレスポンスオブジェクトを配列にラップし、各イメージオブジェクトを配列にラップするという状況は少し複雑です。したがって、次のJavaデータ構造はこの構造を正確に照合するだけです。

import java.io.FileReader; 
import java.lang.reflect.Type; 
import java.util.List; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    Type movieListType = new TypeToken<List<Movie>>() {}.getType(); 
    List<Movie> movies = gson.fromJson(new FileReader("input.json"), movieListType); 

    // movies has just one Movie 
    Movie movie = movies.get(0); 

    // Find the first two Backdrop URLs with size = w1280 
    int foundCount = 0; 
    for (Backdrop backdrop : movie.backdrops) 
    { 
     if ("w1280".equals(backdrop.image.size)) 
     { 
     System.out.println("URL Found: " + backdrop.image.url); 
     foundCount++; 
     if (foundCount == 2) 
     { 
      break; 
     } 
     } 
    } 
    } 
} 

class Movie 
{ 
    int id; 
    String name; 
    List<Poster> posters; 
    List<Backdrop> backdrops; 
} 

class Poster 
{ 
    Image image; 
} 

class Backdrop 
{ 
    Image image; 
} 

class Image 
{ 
    String type; 
    String size; 
    int height; 
    int width; 
    String url; 
    String id; 
} 

注:ポスターと背景は(彼らは画像参照を含む)は、同じ正確な構造を有するので、それらは容易に単一のデータ・タイプにマージすることができます。

0

さて、あなたはJSONパーサーを使用して文字列を解析する必要があります。それが一番簡単です。しかし、JSONパーサーを使って直接2つのURLを取得することはできません。また、文字列を解析する際に、これらの2つのURLを選択する基準に基づいている必要があります。

行番号でアクセスすることはできません。

0

GSONを使用してください。あなたはそれをデシリアライズすることができGSON APIを使用して、その後、クラス

class Poster { 
static class Image { 
    String url; 
} 
Image image; 
} 
class Result { 
List<Poster> posters; 
} 

を定義することができます。しかし、GSONはすべての要素を含むリストを作成するので、あなたにはあなたを食べることに注意してください。 もう1つの方法は、正規表現の使用ですが、それはもっと多くのmemmoryを取ることができます。 私が最も効率的な方法は、自分のループベースのロジックを書くことになると思う:/

+0

2つのJSONリストの項目数は比較的少ないので、過剰なメモリ消費は心配しません。 –

0
JSONArray allData; 
JSONObject individualMovie; 
JSONArray backDrops; 
JSONObject single_backdrop; 

allData = someMethodToGetJsonFromUrl; 

int movieCount = 0; 
while(!allData.isNull(movieCount)) 
{ 
    individualMovie = allData.optJSONObject(showCount); 
    backDrops = individualMovie.optJSONArray("backdrops"); 
    //WE now have all the backdrops to movie0 
    //to get the data from the FIRST backdrop: 

    single_backdrop = backDrops.optJSONObject(0).optJSONbject("image"); 

    //NOW we can access the id/url/height/width 
    String URL = single_backdrop.optString("url"); 

    //do something with url 
    movieCount++; 
    //loop through all movies 
} 

これは少し荒いですが、私はあなたのアイデア

関連する問題