#java #json #spring #jackson
#java #json #spring #джексон
Вопрос:
Я хочу fetchMultiple(ParameterizedTypeReference<List<T>> responseType)
для данного List<T>
, в данном случае, я хочу получить непосредственно List<Account>
, но я получаю сообщение об ошибке, потому что список учетных записей инкапсулирован в другой объект, как показано ниже:
{
"accounts": [
{
"accountUid": "c75deb59-5d52-4a23-af7b-fce29927ce9d",
"defaultCategory": "b4189da5-7688-42d0-86e3-14ae9031e01d",
"currency": "GBP",
"createdAt": "2020-08-05T16:50:50.536Z"
}
]
}
Существует некоторая аннотация Jackson для фильтрации этого каким-либо образом, чтобы быть обработанным следующим образом:
[
{
"accountUid": "c75deb59-5d52-4a23-af7b-fce29927ce9d",
"defaultCategory": "b4189da5-7688-42d0-86e3-14ae9031e01d",
"currency": "GBP",
"createdAt": "2020-08-05T16:50:50.536Z"
}
]
POJO
@Data
public class Account {
private String accountUid;
private String defaultCategory;
private String currency;
private String createdAt;
}
RestRequestTemplate.java
public List<T> fetchMultiple(ParameterizedTypeReference<List<T>> responseType) {
return new RestTemplate().exchange(this.url, this.httpMethod, this.request, responseType).getBody();
}
AccountsServiceImpl.java
public List<Account> getAccounts() {
RestRequestTemplate restRequestTemplate = new RestRequestTemplate(GET_ACCOUNTS, HttpMethod.GET, Collections.EMPTY_MAP);
return restRequestTemplate.fetchMultiple(new ParameterizedTypeReference<List<Account>>() {});
}
Комментарии:
1. Есть ли какая-либо конкретная причина для использования List<T> в качестве параметра в методе fetchMultiple(ParameterizedTypeReference<List<T>> responseType)? Если нет, мы можем изменить его на просто fetchMultiple(параметризованный тип ссылки<T> responseType)
2. Какую ошибку вы получаете?
3. исключение com.fasterxml.jackson.databind.exc.MismatchedInputException: не удается десериализовать экземпляр
java.util.ArrayList<com.starlingbank.challenge.roundup.model.accounts.Account>
из токена START_OBJECT в [Источник: (PushbackInputStream); строка: 1, столбец: 1]4. Я ищу
List<T>
в качестве параметра, потому что я ищу общее решение, если вместо этого у меня естьT
в качестве параметра, который мне нужно будет создатьAccountResponse
, реализация выглядит примерно так: public List<T> fetchMultiple(ParameterizedTypeReference<T> responseType) { AccountResponse response = (AccountResponse) new RestTemplate().exchange(this.url, this.HttpMethod, this.request,responseType). getBody(); возвращает (список) response.getAccounts(); }
Ответ №1:
Действительно, существует аннотация для игнорирования корневого объекта. Это называется @JsonUnwrapped
. Аннотируйте свой метод этой аннотацией, и ваш json
должен быть без корневого объекта.