我在大学的作业中使用TheMovieDB API,我很难理解如何从嵌套的JSON文件格式中访问值。
目前,我的代码如下所示:
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 :(得分: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。