美好的一天人們。 我在這裏有這個JSON結果http://pastebin.com/9psYCfGj。 我想獲得前兩個背景(從607行開始)。從JSON獲取數據
所以我想第一個背景的URL與w1280(線639) 的大小而第二個背景與w1280的大小URL(線680)
我怎麼會只得到這兩個網址
感謝 湯姆
美好的一天人們。 我在這裏有這個JSON結果http://pastebin.com/9psYCfGj。 我想獲得前兩個背景(從607行開始)。從JSON獲取數據
所以我想第一個背景的URL與w1280(線639) 的大小而第二個背景與w1280的大小URL(線680)
我怎麼會只得到這兩個網址
感謝 湯姆
在原來的問題的例子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;
}
注:由於海報和背景幕具有相同的確切結構(它們只包含一個圖片參考),它們可以很容易地合併成一個單一的數據類型。
那麼,你將不得不解析使用JSON解析器的字符串。這是最簡單的。但通過使用JSON解析器無法直接獲取這兩個URL。此外,您需要有一個標準,在分析字符串時您將根據這些標準來選擇這兩個URL。
您無法通過行號訪問它。
使用GSON。你可以定義類
class Poster {
static class Image {
String url;
}
Image image;
}
class Result {
List<Poster> posters;
}
然後使用GSON API可以反序列化它。但請注意,GSON將創建包含所有元素的列表,以便它可以讓您記憶。 另一種方式是使用正則表達式,但它可能需要更多的內存。 我認爲最有效的方式會寫自己的基於循環的邏輯:/
兩個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嗎?你從哪裏得到數據? –