1

我正在尝试使用 Guardian API 中的 JSON 对象。

这是我打电话的结果:

https://pastebin.com/wqggLEeZ

这是我的代码

JSONObject root = new JSONObject(jsonData);
JSONArray resultArray = root.getJSONObject("response").getJSONArray("results");

for(int i=0;i<resultArray.length();i++) {
    JSONObject resultElement = resultArray.getJSONObject(i);
    JSONObject blocksElement = resultElement.getJSONObject("blocks");
    JSONObject mainElement = blocksElement.getJSONObject("main");
    JSONArray elementsArray = mainElement.getJSONArray("elements");
    JSONObject elementsElement = elementsArray.getJSONObject(0);
    JSONArray assetsArray = elementsElement.getJSONArray("assets");
    JSONObject assetsElement = assetsArray.getJSONObject(0);

    String imageUrl = assetsElement.getString("file");
    String articleTitle = resultElement.getString("webTitle");

    news.add(new NewsList(articleTitle, imageUrl));
}

该代码工作正常,只是它停在 3 个元素 (i=2)

我尝试用“test”字符串替换 imageUrl

news.add(new NewsList(articleTitle, imageUrl));

但它仍然停留在 3 个元素处。

但是,当我注释掉它找到 imageUrl 的部分时,整个代码都可以工作,并给了我 10 个应该做的结果:

JSONObject root = new JSONObject(jsonData);
JSONArray resultArray = root.getJSONObject("response").getJSONArray("results");

for(int i=0;i<resultArray.length();i++){
    JSONObject resultElement = resultArray.getJSONObject(i);
    /*
    JSONObject blocksElement = resultElement.getJSONObject("blocks");
    JSONObject mainElement = blocksElement.getJSONObject("main");
    JSONArray elementsArray = mainElement.getJSONArray("elements");
    JSONObject elementsElement = elementsArray.getJSONObject(0);
    JSONArray assetsArray = elementsElement.getJSONArray("assets");
    JSONObject assetsElement = assetsArray.getJSONObject(0);
    String imageUrl = assetsElement.getString("file");
    */

    String articleTitle = resultElement.getString("webTitle");

    news.add(new NewsList(articleTitle, "test"));
}

我在 Android 监视器中环顾四周,似乎有一个问题说

org.json.JSONException: main 没有值

但这是不正确的,因为前 3 个结果的 URL 没有任何问题,该问题仅在循环 3 次迭代后出现,我找不到任何原因导致这种情况发生。

4

2 回答 2

1

在任何地方使用“opt”而不是“get”,例如:

JSONObject assetsElement = assetsArray.optJSONObject(0);
String imageUrl = assetsElement.optString("file");
于 2017-04-15T13:05:58.647 回答
1

发生这种情况是因为在该行的某个位置的响应中没有“main”字段

            JSONObject mainElement = blocksElement.getJSONObject("main");

因此,如果在响应中的任何位置缺少任何字段,那么在该位置之后,代码将不会在 JSON 解析中编译。

抱歉英语不好。

于 2017-04-15T13:09:54.740 回答