Десериализация Джексона ниже свойства JSON

#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 должен быть без корневого объекта.