Как проанализировать большой вложенный файл JSON с Джексоном? - PullRequest
0 голосов
/ 29 марта 2019

Я работаю над своим веб-API на Spring, и он должен позволять предоставлять конечные точки и предоставлять соответствующую информацию на основе данных, считанных из файла JSON. Но у меня проблема с десериализацией вложенного файла JSON с помощью Jackson.

Я создал класс Book и попытался отобразить JSON в HashMap, чтобы сохранить эти объекты. Но файл JSON содержит больше данных, чем я хочу получить, и он вложен как «volumeInfo».

class Book {

    private String isbn;
    private String title;
    private String subtitle;
    private String publisher;
    private long publishedDate;
    private String description;
    private int pageCount;
    private String thumbnailUrl;
    private String language;
    private String previewLink;
    private double averageRating;
    private String[] authors;
    private String[] categories;

// getters and setters

образец файла data.json


{
 "requestedUrl": "https://www.googleapis.com/books/v1/volumes?q=java&maxResults=40",
 "items": [
  {
   "kind": "books#volume",
   "id": "7tkN1CYzn2cC",
   "etag": "pfjjxSpetIM",
   "selfLink": "https://www.googleapis.com/books/v1/volumes/7tkN1CYzn2cC",
   "volumeInfo": {
    "title": "A Hypervista of the Java Landscape",
    "publisher": "InfoStrategist.com",
    "industryIdentifiers": [
     {
      "type": "ISBN_13",
      "identifier": "9781592432172"
     },
     {
      "type": "ISBN_10",
      "identifier": "1592432174"
     }
    ],

  ]
}

Как мне добраться до этого тома с Джексоном?

1 Ответ

2 голосов
/ 29 марта 2019

Вам нужно проанализировать его как JsonNode, выполнить итерацию по каждому узлу в массиве и преобразовать в Book:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

JsonNode root = mapper.readTree(json); // read as JsonNode 
JsonNode items = root.at("/items");
List<Book> books = new ArrayList<>();
if (items.isArray()) {
    ArrayNode array = (ArrayNode) items;
    array.forEach(n -> {
        Book book = mapper.convertValue(n.get("volumeInfo"), Book.class); // convert to Book
        books.add(book);
    });
}
System.out.println(books);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...