Доступ к значениям внутреннего массива в JSONArray

Я использую IntelliJ и API Gooks Books, и я кодирую на Java, используя простой json. Я пишу программу, в которой пользователь может ввести название книги в терминале, а API возвращает 5 книг и информацию о каждой из этих книг. API возвращает много информации о книгах, но я хочу, чтобы он возвращал только название книги, автора и издателя. Я новичок в использовании APis и JSON, поэтому не знаю, связаны ли мои ошибки с синтаксическими или логическими ошибками.

Например, я ввожу Гарри Поттер, и это часть того, что возвращает API.

{
 "kind": "books#volumes",
 "totalItems": 1832,
 "items": [
  {
   "kind": "books#volume",
   "id": "cvRFvgAACAAJ",
   "etag": "mfbVxWEkveo",
   "selfLink": "https://www.googleapis.com/books/v1/volumes/cvRFvgAACAAJ",
   "volumeInfo": {
    "title": "Harry Potter and the Cursed Child",
    "subtitle": "Parts one and two",
    "authors": [
     "Jack Thorne",
     "J. K. Rowling",
     "John Tiffany"
    ],
    "publisher": "THORNDIKE Press",
    "publishedDate": "2016",
    "description": "\"Thorndike Press large print the literacy bridge.\"",
    "industryIdentifiers": [
     {
      "type": "ISBN_10",
      "identifier": "1410496201"
     },
     {
      "type": "ISBN_13",
      "identifier": "9781410496201"
     }
    ],
    "readingModes": {
     "text": false,
     "image": false
    },
    "pageCount": 407,
    "printType": "BOOK",
    "categories": [
     "Good and evil"
    ],

Я читал, что один из способов получить конкретную информацию - создать JSONArray и сделать информацию из API JSONObjects. Мне удалось успешно проанализировать данные, поэтому каждый JSONObject представляет собой одну книгу и всю ее информацию, но я не знаю, как распечатать ТОЛЬКО ту конкретную информацию, которую я хочу.

Это часть кода, который у меня есть. Код от TODO и далее - вот где у меня проблемы

String inline = ""; //gets the JSON data and makes it a String
    Scanner sc = new Scanner(url.openStream()); //reads JSON data
    while (sc.hasNext())
    {
      inline += sc.nextLine();
    }
    sc.close();

    JSONParser parse = new JSONParser();
    JSONObject jObj = (JSONObject)parse.parse(inline);
    JSONArray theJArray = (JSONArray)jObj.get("items");

    for (int i = 0; i < theJArray.size(); i++)
    {
      JSONObject secondJObj = (JSONObject)theJArray.get(i);
      System.out.println("The secondJobj: " + secondJObj); //one object is one book and its info

      JSONArray specificArr = (JSONArray)secondJObj.get("author"); //TODO
      System.out.println("The specificArr is: " + specificArr); //returns null
      System.out.println("The specific section: " + secondJObj.get("author")); //returns null
    }

Насколько я понимаю, все находится в массиве «items», поэтому массив «авторы» - это массив внутри другого массива. Как мне получить доступ к информации в массиве «авторы»?

Мне также нужны название и издатель книги, и я знаю, что это не массивы, поэтому это не похоже на вызов информации из массива «авторы». Как мне получить информацию из массива «items» только для значений ключей «title» и «publisher»?


person Janeen    schedule 12.11.2019    source источник


Ответы (1)


Я вижу ваши усилия в приведенном выше коде, но author находится внутри volumeInfo JsonObject

"volumeInfo": {
"title": "Harry Potter and the Cursed Child",
"subtitle": "Parts one and two",
"authors": [
 "Jack Thorne",
 "J. K. Rowling",
 "John Tiffany"
],

Итак, в цикле for сначала вам нужно получить volumeInfo как JSONObject, а затем получить author как JSONArray

for (int i = 0; i < theJArray.size(); i++)
{
  JSONObject secondJObj = (JSONObject)theJArray.get(i);
  System.out.println("The secondJobj: " + secondJObj); //one object is one book and its info

  JSONObject volInfo = (JSONObject)secondJObj.get("volumeInfo"); //TODO
    // then get author
   JSONArray specificArr = (JSONArray)volInfo.get("author");
}
person Deadpool    schedule 12.11.2019