2016-11-08 7 views
-1

Я использую TheMovieDB API в своей работе по присваиванию для Университета, и мне трудно понять, как получить доступ к значениям из своего вложенного формата файлов JSON.Как получить данные из вложенных файлов JSON

Ниже приводится ссылка на файл я пытаюсь использовать: https://api.themoviedb.org/3/discover/movie?api_key=822b6a3af922b0c70d5455e2d2e0f782&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=true&page=1

В настоящее время мой код выглядит следующим образом:

httpConnect jParser = new httpConnect(); 
String json = jParser.getJSONFromUrl(url); 
jsonData = json.toString(); 

JSONObject json1obj = new JSONObject(json); 
JSONArray json1arr = json1obj.getJSONArray("results"); 
String jsonResults = json1arr.toString(); 

JSONObject first = new JSONArray(jsonResults).getJSONObject(0); 
JSONArray second = first.getJSONArray("poster_path"); 
String secondString = second.toString(); 

poster_path = secondString.toString(); 

Я могу получить доступ к первому слою ("результаты »), но у меня проблемы с этим. Общая цель - получить доступ к объекту «poster_path». Я новичок в Java и JSON, так что это может показаться глупым вопросом. Любая помощь приветствуется :)

+0

'json1arr' - это массив. Вы должны использовать для этого цикл 'for'. –

ответ

0

GSON полезен и прост, и я определенно рекомендую его для любого долгосрочного/многоразового проекта. Однако вы можете достичь своей цели, используя то, что у вас уже есть, не беспокоясь о POJO.Поле «result» - это JSONArray, содержащий JSONObjects. Итак, прокрутите каждый JSONObject и вытащите строку 'poster_path' оттуда. И, чтобы уточнить, поле «poster_path» - это строка, а не объект. Если все плакаты доступны, вы можете использовать что-то вроде этого. Имена методов могут быть не одинаковыми, но они должны быть похожими. Я позволил сократить некоторые из вещей, которые у вас были там.

httpConnect jParser = new httpConnect(); 
JSONObject json1obj = new JSONObject(jParser.getJSONFromUrl(url)); 
JSONArray json1arr = json1obj.getJSONArray("results"); 
List<String> posterPaths = new ArrayList<String>(json1arr.length()); 
for (int i = 0 ; i < json1arr.length(); i++) { 
    JSONObject ithObject = json1arr.getJSONObject(i); 
    // if necessary, check to make sure the key 'poster_path' exists 
    if (ithObject.has("poster_path")) { 
     posterPaths.add(ithObject.getString("poster_path")); 
    } 
} 

// as an example usage, loop through the list and print each poster path 
for (String posterPath : posterPaths) { 
    System.out.println(posterPath); 
} 

Я вижу значение в написании POJO, и создавая более надежное решение, но это может быть хорошим местом для начала, так как вы новичок в Java/JSON.

+0

Спасибо за это! Ответы каждого были отличными, но это именно то, что я хотел и с минимальным количеством кода :) – Jack

0

Из моего опыта, не пытайтесь изобрести колесо дважды, создайте класс модели с атрибутами объекта, который вы извлекаете с сервера, затем импортируете библиотеку gson (библиотека разбора google json), добавьте это в ваш билд Gradle файл -> компиляции «com.google.code.gson: gson: 2.7»

public class YourObject(){ 

    String id; 
    String property; 

public YourObject(){} 

//Getter & Setter 

} 

Gson gson = new Gson(); 
YourObject item = gson.fromJson(json,YourObject.class); 

Если то, что и хотите получить список какой-то пункт подход будет как этот

yourObjectListOfItems= new Gson().fromJson(json,newTypeToken<List<YourObject>>(){}.getType()); 

ОЧЕНЬ ВАЖНО - имя atributte должен соответствовать ключу JSON HashMap для этого, чтобы работать

Если структура Json оленью кожа соответствует типичному представлению объекта, поскольку он охватывает различный уровень глубины как бы пытаемся преобразовать строку JSON в JSONObject или JSONArray в зависимости и помещая новый JSON ****() внутри блока catch try и в зависимости от того, что вы ожидаете находиться внутри, вы пытаетесь преобразовать в JSONArray, JSONObject или решить, что вы достигли самого глубокого уровня, чтобы вы не могли анализировать дальше.

0

Вы можете пойти с библиотекой GSON (https://github.com/google/gson)

Во-первых, добавьте в ваших зависимостей build.gradle приложения:

'com.google.code.gson:gson:2.8.0'

Чем, перейдите по ссылке: http://www.jsonschema2pojo.org и вставить JSON, выбор правильных параметров (JSON вместо JSON Schema, Gson и т. д.).

Вы получите все классы, необходимые для представления своего JSON.

Например, веб-сайт будет генерировать много классов, но первый из них будет:

public class RootClass { 

@SerializedName("page") 
@Expose 
private Integer page; 
@SerializedName("results") 
@Expose 
private List<Result> results = new ArrayList<Result>(); 
@SerializedName("total_results") 
@Expose 
private Integer totalResults; 
@SerializedName("total_pages") 
@Expose 
private Integer totalPages; 

/** 
* 
* @return 
* The page 
*/ 
public Integer getPage() { 
return page; 
} 

/** 
* 
* @param page 
* The page 
*/ 
public void setPage(Integer page) { 
this.page = page; 
} 

/** 
* 
* @return 
* The results 
*/ 
public List<Result> getResults() { 
return results; 
} 

/** 
* 
* @param results 
* The results 
*/ 
public void setResults(List<Result> results) { 
this.results = results; 
} 

/** 
* 
* @return 
* The totalResults 
*/ 
public Integer getTotalResults() { 
return totalResults; 
} 

/** 
* 
* @param totalResults 
* The total_results 
*/ 
public void setTotalResults(Integer totalResults) { 
this.totalResults = totalResults; 
} 

/** 
* 
* @return 
* The totalPages 
*/ 
public Integer getTotalPages() { 
return totalPages; 
} 

/** 
* 
* @param totalPages 
* The total_pages 
*/ 
public void setTotalPages(Integer totalPages) { 
this.totalPages = totalPages; 
} 

} 

Чем, вы можете использовать:

Gson gson = new Gson(); 
RootClass item = gson.fromJson(json, RootClass.class); 

Поскольку ваш JSON не является массивом, является объект.

Но, вероятно, вам нужно перебирать страницы, потому что есть 297964 элемента и 14899 страниц!

+0

Как это отличается от существующего ответа? –

+0

@ cricket_007 подробно для вопроса в случае, если он испытывает трудности .. Не могу ли я попытаться дать ответ только потому, что похож на другой данный ответ? Вообще ответы похожи, не так ли? Это не соревнование, я пытаюсь помочь, потому что у меня была такая же проблема, когда я учился ... –