2011-07-11 210 views
1

美好的一天人們。 我在這裏有這個JSON結果http://pastebin.com/9psYCfGj。 我想獲得前兩個背景(從607行開始)。從JSON獲取數據

所以我想第一個背景的URL與w1280(線639) 的大小而第二個背景與w1280的大小URL(線680)

我怎麼會只得到這兩個網址

感謝 湯姆

+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" 
       } 
      } 
     ] 
    } 
] 

正如已經建議,一個簡單的方法是使用GSON的JSON反序列化到Java的數據結構,然後遍歷通過Java結構來選擇目標數據。另外,確實存在至少兩個Java到/來自JSON庫,它們允許xpath-like選擇查詢簡單地提取目標數據,但與其他用於閱讀JSON的Java庫相比,它們非常慢,並且它們不還沒有很多社區的使用和支持,所以我不會推薦他們。無論如何,無論是使用Gson還是任何其他Java到/從JSON庫,您都會很好地決定除行號之外的選擇標準。

假設選擇目標包含前兩個大小爲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解析器無法直接獲取這兩個URL。此外,您需要有一個標準,在分析字符串時您將根據這些標準來選擇這兩個URL。

您無法通過行號訪問它。

0

使用GSON。你可以定義類

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

然後使用GSON API可以反序列化它。但請注意,GSON將創建包含所有元素的列表,以便它可以讓您記憶。 另一種方式是使用正則表達式,但它可能需要更多的內存。 我認爲最有效的方式會寫自己的基於循環的邏輯:/

+0

兩個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 
} 

這是一個有點粗糙,但我希望你的想法