Разбор JSON в Java из файла - PullRequest
1 голос
/ 01 июля 2019

Я делаю свои первые шаги в программировании JSON. У меня большой JSON-файл с архивом книг:

https://www.googleapis.com/books/v1/volumes?q=java&maxResults=30

Я создал POJO с геттерами и сеттерами. Теперь я хочу найти, например, все книги, написанные данным автором:

byte[] jsonData = Files.readAllBytes(Paths.get("archive.json"));
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonData);

JsonNode authorNode = rootNode.path("Gary Cornell");
Iterator<JsonNode> elements = authorNode.elements();
while(elements.hasNext()){
    JsonNode isbn = elements.next();
    System.out.println(isbn.textValue());
}

Но, к сожалению, я делаю что-то не так. Мое приложение просто написать весь JSON.

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Большинство методов jsonNode ожидают, что fieldNames не являются действительными значениями.

Если вы ищете ISBN, вы можете сделать это следующим образом (так что это, вероятно, не лучший пример)

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

        byte[] jsonData = Files.readAllBytes(Paths.get("archive.json"));
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(jsonData);

        List<JsonNode> volumeNodes = rootNode.findValues("volumeInfo");
        String authorName = "Gary Cornell";

        for (JsonNode volumeNode : volumeNodes) {

            JsonNode authors = volumeNode.path("authors");
            Iterator<JsonNode> authorIt = authors.elements();

            while(authorIt.hasNext()){

                JsonNode author = authorIt.next();

                if (authorName.equals(author.textValue())) {

                    System.out.println(author.textValue());

                    JsonNode isbn = volumeNode.path("industryIdentifiers");
                    Iterator<JsonNode> isbnIt = isbn.elements();

                    while(isbnIt.hasNext()) {
                        System.out.println(isbnIt.next());
                    }
                }
            }
        }
    }
0 голосов
/ 01 июля 2019

Спасибо, ребята, это было именно то, что мне было нужно.

0 голосов
/ 01 июля 2019

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

byte[] jsonData = Files.readAllBytes(Paths.get("volumes.json"));
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonData);
String authorName = "Joshua Bloch"; // author name to find
JsonNode items = rootNode.path("items");
Iterator<JsonNode> elements = items.elements();

while(elements.hasNext()){
    JsonNode isbn = elements.next();
    if(isbn.has("volumeInfo")) {
        JsonNode volumeInfo = isbn.path("volumeInfo");
        if(volumeInfo.has("authors")) {
            JsonNode authors = volumeInfo.path("authors");
            if(authors.toString().contains(authorName)) {
                // Print complete book JSON value
                System.out.println(isbn.toString());
            }
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...