Как извлечь поле из API книг Google с помощью GSON и Jsoup - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок здесь и пытаюсь извлечь названия и авторов из API Google по ISBN.

Вот код:

 try {
     Document   docKb = Jsoup.connect("https://www.googleapis.com/books/v1/volumes?q=isbn:0735619670").ignoreContentType(true).get();
        String json = docKb.body().text();

        Gson gson = new Gson();
        //new Gson().toJson(new HashMap(map)); 
        Map<String, Object> asMap = gson.fromJson(json, Map.class);
        List<Map<String, Object>> items = (List) asMap.get("items");
        //  Map<String, Object> e = (Map) error.get("error")
        for (Map<String, Object> item : items) {
            if (item.containsKey("title") && item.containsKey("authors")) {
                String title = (String) item.get("title");
                System.out.println("if Título: " + title);
            } else {
                System.out.println("Título: " + item.get("title") + "\n");
                System.out.println("Autor: " + item.get("authors"));    

       }
       }
        System.out.println("items: "+ items );

    }catch(IOException e){
        e.printStackTrace();            
    }

Это не сработало ... для заголовка и автора значения были нулевыми, но в списке "items" он все удалил из API.

1 Ответ

0 голосов
/ 04 ноября 2018

Здесь происходит простая ошибка синтаксического анализа JSON. Вы не даете GSON правильный класс. Проще говоря, этот JSON не является Map. Вместо этого это объект, который содержит:

String kind;
int totalItems;
Object items;

Ниже я предоставил полный код, необходимый для правильного анализа этого JSON (при условии, что вы в состоянии правильно получить строку JSON.

class ClassWhatever {
    public static void main(String[] args) {
        String url = "https://www.googleapis.com/books/v1/volumes?q=isbn:0735619670";
        // Assuming that you do in fact have the JSON string...
        String json = "the correct json";

        Container fullJsonObject = new Gson().fromJson(json, Container.class);

        for (Item i : fullJsonObject.items) {
            System.out.println(i.volumeInfo.authors[0]);
        }
    }

    private class Container {
        String kind;
        int totalItems;
        Item[] items;
    }

    private class Item {
        String kind;
        String id;
        String etag;
        ///blah
        VolumeInfo volumeInfo;
        String publisher;
        ///etc.

    }

    private class VolumeInfo {
        String title;
        String[] authors;
    }
}

Выход:

Steve McConnell
Steve McConnell

Примечания:

Вам нужно только добавить поля, которые вы хотите. Например, если вам не нужен String kind, просто не помещайте его в свой класс Container. Для краткости я оставил много полей, но, конечно, вставьте их, если они вам нужны.

Кроме того, я решил использовать массивы вместо списков. Они полностью взаимозаменяемы, если вы правильно форматируете свой код.

...