2016-11-08 138 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”字段是一个包含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的好地方。

+0

谢谢!每个人的回答都很棒,但这正是我想要的,并且只需最少量的代码:) – Jack

0

从我的经验,不要试图发明轮两次,创建一个模型类与您从服务器检索的对象atribut,然后导入gson库(谷歌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 ****()放入try catch块中,并取决于您期望在里面尝试转换为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这是详细的问题,以防万一他有困难..我不能尝试只是因为与另一个给定的答案类似的答案吗?一般的答案是相似的,你不觉得吗?这不是一场比赛,我想帮忙,因为我在学习时遇到同样的问题... –