Как мне разобрать данные Json из openlibrary api? Использование Jsoup и Gson - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь работать с книжным API из openlibrary. Итак, мой вопрос, как я могу очистить данные? что мне нужно, это очистить название, автора, издателя и дату публикации.

JSON

{
    "ISBN:0789721813": {
        "bib_key": "ISBN:0789721813",
        "preview": "noview",
        "preview_url": "https://openlibrary.org/books/OL18096553M/Red_Hat_Linux",
        "info_url": "https://openlibrary.org/books/OL18096553M/Red_Hat_Linux",
        "details": {
            "number_of_pages": 757,
            "subtitle": "installation and configuration handbook",
            "latest_revision": 3,
            "contributions": [
                "Hellums, Duane"
            ],
            "title": "Red Hat Linux",
            "languages": [
                {
                    "key": "/languages/eng"
                }
            ],
            "subjects": [
                "Linux",
                "Operating systems (Computers)"
            ],
            "publish_country": "inu",
            "by_statement": "Duane Hellums, et al",
            "type": {
                "key": "/type/edition"
            },
            "revision": 3,
            "other_titles": [
                "Red Hat Linux version 6.0"
            ],
            "publishers": [
                "Que"
            ],
            "last_modified": {
                "type": "/type/datetime",
                "value": "2010-08-18T08:53:00.844526"
            },
            "key": "/books/OL18096553M",
            "publish_places": [
                "Indianapolis, Ind"
            ],
            "pagination": "xix, 757 p. :",
            "created": {
                "type": "/type/datetime",
                "value": "2008-10-10T19:27:28.086386"
            },
            "lccn": [
                "99063852"
            ],
            "notes": {
                "type": "/type/text",
                "value": "\"Red Hat Linux version 6.0.\"--Cover\n\nIncludes index"
            },
            "identifiers": {
                "librarything": [
                    "261776"
                ],
                "goodreads": [
                    "3382689"
                ]
            },
            "isbn_10": [
                "0789721813"
            ],
            "publish_date": "2000"
        }
    }
}

и вот мой код:

class JsonClass {
    public static void main(String[] args) throws IOException {

        org.jsoup.nodes.Document docKb = Jsoup
                .connect("https://openlibrary.org/api/books?bibkeys=ISBN:0789721813&jscmd=details&format=json")
                .ignoreContentType(true).get();
        String json = docKb.body().text();
        String titulo;

        Container fullJsonObject = new Gson().fromJson(json, Container.class);
        for (Details i : fullJsonObject.details) {
            System.out.println("Author: " + i.by_statement);
            System.out.println("Title: " + i.title);
            System.out.println("Editora:  " + i.type.publishers[0]);
            System.out.println("Ano de publicação: " + i.type.notes);
        }

    }

    private class Container {
        Details[] details;
    }

    private class Details {
        String title;
        String by_statement;
        Type type;
    }

    private class Type {
        String publishers[];
        Notes notes;
    }

    private class Notes {
        String publish_date;

    }

}

Я пытался, и это просто дает мне java.lang.NullPointerException в этой строке:

 for (Details i : fullJsonObject.details) {   

Я довольно оцепенел, поэтому любой ответ может помочь, спасибо.

1 Ответ

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

Ваша проблема в том, что вы пытаетесь проанализировать один Container с массивом Detail с, но на самом деле ответом является Map с Container.bib_key в качестве ключа и Container само как значение так Map<String, Container>. Кажется, что этот метод API готов возвращать более одного Container за один раз

Также Container.details - это не объект, а отдельное значение. Так что Container меняется на:

private class Container {
    Details details;
}

и анализ правильного вида объекта может дать вам лучшие результаты, например:

java.lang.reflect.Type type =
        new TypeToken<Map<String, Container>>(){}.getType();        
Map<String, Container> fullJsonObject = new Gson().fromJson(json, type);
...