java - Google Books Api - imageLinks 没有值(value) - Android JSONException

标签 java android json google-books jsonexception

我正在使用 Google Books Api 显示图书列表,但当我尝试从 imageLinks JSONObject 获取缩略图网址时,JSONException 表示 imageLinks 没有值,即使该值存在于该对象中。

我尝试了 JSONObject.isNull()optString() 等方法而不是 getString(),但它仍然没有给我任何值(value)。

这是我尝试从中获取数据的 URL:https://www.googleapis.com/books/v1/volumes?q=android

代码如下:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener < JSONObject > () {
 @Override
 public void onResponse(JSONObject response) {
  if (response != null) {
   try {
    JSONArray jsonItemsArray = response.getJSONArray("items");
    for (int i = 0; i < jsonItemsArray.length(); i++) {
     String thumbnailUrl = "";
     String title = "";
     JSONObject item = jsonItemsArray.getJSONObject(i);
     JSONObject volumeInfo = item.getJSONObject("volumeInfo");
     JSONObject thumbnailUrlObject = volumeInfo.getJSONObject("imageLinks");
     if (!thumbnailUrlObject.isNull("thumbnail")) {
      thumbnailUrl = thumbnailUrlObject.getString("thumbnail");
     }
     title = volumeInfo.getString("title");
     bookList.add(new Book(title, thumbnailUrl));
     booksAdapter.notifyDataSetChanged();
    }

   } catch (JSONException e) {
    e.printStackTrace();
   }
  }
 }
}, new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {
  error.printStackTrace();
 }
});

这是 JSON 响应的一部分:

"kind": "books#volumes",
 "totalItems": 500,
 "items": [
  {
   "kind": "books#volume",
   "id": "JUVjAgAAQBAJ",
   "etag": "kbnCYPNPKq4",
   "selfLink": "https://www.googleapis.com/books/v1/volumes/JUVjAgAAQBAJ",
   "volumeInfo": {
    "title": "Android. Podstawy tworzenia aplikacji",
    "authors": [
     "Andrzej Stasiewicz"
    ],
    "publisher": "Helion",
    "publishedDate": "2013-11-10",
    "description": "Na szczęście dostępna jest już książka Android.",
    "industryIdentifiers": [
     {
      "type": "ISBN_13",
      "identifier": "9788324688418"
     },
     {
      "type": "ISBN_10",
      "identifier": "8324688412"
     }
    ],
    "readingModes": {
     "text": true,
     "image": true
    },
    "pageCount": 216,
    "printType": "BOOK",
    "categories": [
     "Computers"
    ],
    "averageRating": 4.0,
    "ratingsCount": 1,
    "maturityRating": "NOT_MATURE",
    "allowAnonLogging": true,
    "contentVersion": "1.4.4.0.preview.3",
    "imageLinks": {
     "smallThumbnail": "http://books.google.com/books/content?id=JUVjAgAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api",
     "thumbnail": "http://books.google.com/books/content?id=JUVjAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api"
    }

我想知道为什么 volumeInfo.getJSONObject("imageLinks") 给我的 JSONException 没有任何值(value),即使 imageLinks 有值(value)。

最佳答案

并非每个 volumeInfo 节点都有 imageLinks 节点,因此您需要使用 node.has 方法或 node.opt* 方法检查给定节点是否存在,并检查结果是否不为 null。您可以在下面找到获取thumbnail节点的安全方法:

JSONObject thumbnailUrlObject = volumeInfo.optJSONObject("imageLinks");
if (thumbnailUrlObject != null && thumbnailUrlObject.has("thumbnail")) {
    thumbnailUrl = thumbnailUrlObject.getString("thumbnail");
}

简单的控制台应用程序,显示其工作原理:

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.File;
import java.nio.file.Files;

public class OrgJsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();
        String json = String.join("", Files.readAllLines(jsonFile.toPath()));

        JSONObject response = new JSONObject(json);

        // get items
        JSONArray jsonItemsArray = response.getJSONArray("items");
        for (int i = 0; i < jsonItemsArray.length(); i++) {
            String thumbnailUrl = "";
            JSONObject item = jsonItemsArray.getJSONObject(i);
            JSONObject volumeInfo = item.getJSONObject("volumeInfo");
            JSONObject thumbnailUrlObject = volumeInfo.optJSONObject("imageLinks");
            if (thumbnailUrlObject != null && thumbnailUrlObject.has("thumbnail")) {
                thumbnailUrl = thumbnailUrlObject.getString("thumbnail");
            }
            String title = volumeInfo.getString("title");
            System.out.println("title => " + title);
            System.out.println("thumbnail => " + thumbnailUrl);
        }
    }
}

以上 JSON 有效负载打印代码:

title => Android Aplikacje wielowątkowe techniki przetwarzania
thumbnail => 
title => Android. Receptury
thumbnail => http://books.google.com/books/content?id=pZ5iAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Android. Podstawy tworzenia aplikacji
thumbnail => http://books.google.com/books/content?id=JUVjAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Optymalizacja wydajności aplikacji na Android
thumbnail => http://books.google.com/books/content?id=WJ1iAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Inteligentny dom. Automatyzacja mieszkania za pomocą platformy Arduino, systemu Android i zwykłego komputera
thumbnail => http://books.google.com/books/content?id=koiKAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Android UI. Podręcznik dla projektantów. Smashing Magazine
thumbnail => http://books.google.com/books/content?id=HEJjAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Android. Programowanie gier na tablety
thumbnail => http://books.google.com/books/content?id=7J1iAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Profesjonalne tworzenie gier internetowych dla systemu Android w językach HTML5, CSS3 i JavaScript
thumbnail => http://books.google.com/books/content?id=vlNjAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Beginning Android 2
thumbnail => http://books.google.com/books/content?id=2XeNswkT_2YC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
title => Pro Android 2
thumbnail => http://books.google.com/books/content?id=Bam8K5SIiTkC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api

关于java - Google Books Api - imageLinks 没有值(value) - Android JSONException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55382520/

相关文章:

javascript - socket.io 客户端连接到服务器但不通信

java - 为什么 JSON 响应是 200

java - 用java打印SQL表

java - 无法从 .net Web 服务获取 JSONArray

android - 电池电量状态 (0x2A1B) 蓝牙规范是什么意思?

java - Android 无法发送多播 UDP 数据报

json - JQ向嵌套数组中的嵌套对象添加属性

javascript - 如何操作 json 数组中的每个项目以转到特定的元素类、href、id、文本等?

java - 如果 TextView 显示特定文本,则将可见性设置为 GONE

java - 使用 Java 生成 Word 和 Powerpoint 文档的最佳实践