Получение данных из JSON - PullRequest
1 голос
/ 11 июля 2011

Добрый день, люди.У меня есть этот результат JSON здесь http://pastebin.com/9psYCfGj. И я хочу получить первые 2 фоновых изображения (начало в строке 607).

Итак, я хочу получить URL первого фона размером w1280(строка 639) И URL второго фона с размером w1280 (строка 680)

Как бы я получил только эти два URL

Спасибо, Том

Ответы [ 4 ]

0 голосов
/ 11 июля 2011

Пример 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-подобным запросам выбора просто извлекать только целевые данные, но они очень медленны по сравнению с другими библиотеками Java для чтения JSON, и они неПока еще не пользуется и не пользуется поддержкой сообщества, поэтому я бы их не рекомендовал.В любом случае, независимо от того, используете ли вы Gson или любую другую библиотеку Java-to / from-JSON, вам лучше определиться с критериями выбора, кроме номера строки.

Предполагая, что цель выбора включает 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;
}

Примечание. Поскольку Poster и Backdrop имеют одинаковую точную структуру (они просто содержат ссылку на изображение), их можно легко объединить в однутип данных.

0 голосов
/ 11 июля 2011

Использование GSON . Вы можете определить классы

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

Затем с помощью GSON API вы можете десериализовать его. Но имейте в виду, что GSON создаст список со всеми элементами, так что он съест вашу память. Другим способом является использование регулярных выражений, но это может занять гораздо больше памяти. Я думаю, что наиболее эффективным способом будет написание собственной логики на основе цикла: /

0 голосов
/ 11 июля 2011
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
}

это немного грубо, но я надеюсь, что вы поняли

0 голосов
/ 11 июля 2011

Что ж, вам придется проанализировать строку с помощью анализатора JSON. Это самое простое. Но напрямую получить эти 2 URL невозможно с помощью анализатора JSON. Кроме того, вам понадобится критерий, по которому вы будете выбирать эти два URL-адреса при анализе строки.

Вы не можете получить к нему доступ по номерам строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...