Десериализация поля из вложенных объектов в JSON-ответе с помощью Jackson

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

мой сценарий в основном заключается в том, что я потребляю разбитые на страницы ответы JSON, которые выглядят примерно так:

{ 
  "objects": [...],
  "meta": {
    "total": 5000,
    "page": 1,
    "result_pages": 20,
    "links": {
      "prev": null,
      "next": "/api/v3/objects/somequery?page=2"
    }
  }
}

очевидно, что это упрощено, но, надеюсь, он получает точку зрения.

все, что меня действительно волнует, это objects и next поля, но похоже, что мне придется создать целое иерархия DTOs для успешной десериализации вложенных полей.

есть ли аннотация Джексона, которая позволила бы мне пропустить все это? Если нет, есть ли набор рекомендаций для этого, который не включает в себя множество в основном пустых классов и файлов?

1 ответов


есть ли аннотация Джексона, которая позволила бы мне пропустить все это?

можно использовать JsonDeserialize и определите пользовательский JsonDeserializer.

class MetaDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctx) throws IOException {
        JsonNode tree = jp.readValueAsTree();
        return tree.get("links").get("next").asText();
    }
}

здесь я использовал простую десериализацию карты, но если вы хотите, вы можете реализовать свою собственную быструю десериализацию.

объект

class MetaObject {
    public List<Integer> objects;

    @JsonDeserialize(using = MetaDeserializer.class)
    public String meta;

    @Override
    public String toString() {
        return "MetaObject{" + "objects=" + objects + ", meta='" + meta + '\'' + '}';
    }
}

и если вы вызываете MetaObject result = mapper.readValue("...", MetaObject.class) вы получите то, что вы хотите

MetaObject{objects=[1, 2, 3], meta='/api/v3/objects/somequery?page=2'}