Как десериализовать универсальный тип с помощью ObjectMapper Jackson
Я изо всех сил пытаюсь упростить свой код. У меня есть общий opperation, который делает запрос к API и получает объект JSON. Это json
может быть Categories
, Products
и т.д. Я использую jackson ObjectMapper
.
myMethod(String Path, Here The class Type)
Одним из таких распространенных методов является:
public List<Category> showCategories() {
HttpClient client = HttpClientBuilder.create().build();
HttpGet getRequest = new HttpGet(Constants.GET_CATEGORY);
getRequest.setHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
getRequest.setHeader(HttpHeaders.COOKIE, Login.getInstance().getToken());
List<Category> data = null;
HttpResponse response;
try {
response = client.execute(getRequest);
data = Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), new TypeReference<List<Category>>() {
});
} catch (IOException ex) {
LOGGER.error("Error retrieving categories, " + ex.toString());
}
// TODO: Replace List<category> with Observable?
return data;
}
Единственное, что меняется во всех методах, - это тип объекта для извлечения.
Можно обобщите строку
Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), new TypeReference<List<Category>>() {
});
Быть
Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), new TypeReference<List<T>>() {
});
Я попытался добавить в качестве парама к методу Class<T> class
, как показано здесь , но я получаю ошибку Cannot find symbol T
1 ответ:
Я наконец-то нашел решение, вот оно:
public static <T> List<T> getList(String url, Class<T> clazz) { HttpClient client = HttpClientBuilder.create().build(); HttpGet getRequest = new HttpGet(url); getRequest.setHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); getRequest.setHeader(HttpHeaders.COOKIE, Login.getInstance().getToken()); List<T> data = null; HttpResponse response; try { response = client.execute(getRequest); data = Constants.JSON_MAPPER.readValue(response.getEntity().getContent(), Constants.JSON_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } catch (IOException ex) { logger.error("Error retrieving " + clazz.getName() + " " + ex.toString()); } // TODO: Replace List<category> with Observable? return data; }