如何从嵌套的JSON文件中检索数据

时间:2016-11-08 16:58:37

标签: java android json

我在大学的作业中使用TheMovieDB API,我很难理解如何从嵌套的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的新手,所以这看起来像是一个愚蠢的问题。任何帮助表示赞赏:)

3 个答案:

答案 0 :(得分:0)

根据我的经验,不要尝试发明轮子两次,使用从服务器检索的对象的atributtes创建模型类,然后导入gson库(google json解析库),将其添加到构建gradle文件 - &gt ;编译' 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块并取决于你期望在里面你试图转换为JSONArray,JSONObject或决定你已达到最深层,所以你不能进一步解析。

答案 1 :(得分:0)

您可以使用GSON库(https://github.com/google/gson

首先,将此添加到您的app 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页!

答案 2 :(得分:0)

GSON非常有用,我肯定会推荐它用于任何长期/可重复使用的项目。但是,您可以使用已有的目标实现目标,而无需担心POJO。 “result”字段是包含JSONObjects的JSONArray。因此,遍历每个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。