良い一日の人々。 このJSON結果はhttp://pastebin.com/9psYCfGjです。 そして、最初の2つの背景を取得したい(607行目から開始)。JSONからのデータの取得
だから私はw1280のサイズ(ライン639) そしてw1280のサイズ(ライン680)を有する第二背景のURLを持つ最初の背景のURLを取得したい
どのように私だけになるだろうこれらの2つのURL
おかげ トム
良い一日の人々。 このJSON結果はhttp://pastebin.com/9psYCfGjです。 そして、最初の2つの背景を取得したい(607行目から開始)。JSONからのデータの取得
だから私はw1280のサイズ(ライン639) そしてw1280のサイズ(ライン680)を有する第二背景のURLを持つ最初の背景のURLを取得したい
どのように私だけになるだろうこれらの2つのURL
おかげ トム
に元の質問で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;
}
注:ポスターと背景は(彼らは画像参照を含む)は、同じ正確な構造を有するので、それらは容易に単一のデータ・タイプにマージすることができます。
さて、あなたはJSONパーサーを使用して文字列を解析する必要があります。それが一番簡単です。しかし、JSONパーサーを使って直接2つのURLを取得することはできません。また、文字列を解析する際に、これらの2つのURLを選択する基準に基づいている必要があります。
行番号でアクセスすることはできません。
GSONを使用してください。あなたはそれをデシリアライズすることができGSON APIを使用して、その後、クラス
class Poster {
static class Image {
String url;
}
Image image;
}
class Result {
List<Poster> posters;
}
を定義することができます。しかし、GSONはすべての要素を含むリストを作成するので、あなたにはあなたを食べることに注意してください。 もう1つの方法は、正規表現の使用ですが、それはもっと多くのmemmoryを取ることができます。 私が最も効率的な方法は、自分のループベースのロジックを書くことになると思う:/
2つのJSONリストの項目数は比較的少ないので、過剰なメモリ消費は心配しません。 –
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
}
これは少し荒いですが、私はあなたのアイデア
サービスURLを投稿できますか?どこからデータを取得しましたか? –