从JSON获取数据

时间:2011-07-11 16:59:08

标签: java android json gson

美好的一天的人。 我在这里有这个JSON结果http://pastebin.com/9psYCfGj。 我希望得到前两个背景(从第607行开始)。

所以我想得到第一个背景的网址,大小为w1280(第639行) 以及第二个背景的网址,大小为w1280(第680行)

我如何才能获得这两个网址

由于 汤姆

4 个答案:

答案 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引用),因此可以轻松地将它们合并为单个数据类型。