美好的一天的人。 我在这里有这个JSON结果http://pastebin.com/9psYCfGj。 我希望得到前两个背景(从第607行开始)。
所以我想得到第一个背景的网址,大小为w1280(第639行) 以及第二个背景的网址,大小为w1280(第680行)
我如何才能获得这两个网址
由于 汤姆
答案 0 :(得分:0)
好吧,你必须使用JSON解析器解析字符串。这是最简单的。但是使用JSON解析器无法直接获取这两个URL。此外,您需要有一个标准,在解析字符串时您将根据该标准获取这两个URL。
您无法通过行号访问它。
答案 1 :(得分:0)
使用GSON。您可以定义类
class Poster {
static class Image {
String url;
}
Image image;
}
class Result {
List<Poster> posters;
}
然后使用GSON api,您可以反序列化它。但请注意,GSON将创建包含所有元素的列表,因此它会占用你的记忆。 另一种方法是使用正则表达式,但它可能需要更多的记忆。 我认为最有效的方法是编写自己的基于循环的逻辑:/
答案 2 :(得分: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
}
这有点粗糙,但我希望你明白这个想法
答案 3 :(得分: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-to / from-JSON库,它们允许类似xpath的选择查询只是简单地提取目标数据,但与其他用于读取JSON的Java库相比,它们非常慢,并且它们不会还没有很多社区使用和支持,所以我不推荐它们。无论如何,无论是使用Gson还是任何其他Java-to / from-JSON库,您都可以自行决定除行号以外的选择标准。
假设选择目标包括前两个大小为w1280的背景的URL,以下是使用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;
}
注意:由于Poster和Backdrop具有相同的确切结构(它们只包含Image引用),因此可以轻松地将它们合并为单个数据类型。