Intereting Posts
Аутентификация Facebook без кнопки входа в систему Mockito + Dexmaker на Android Как отключить emoji от ввода в Android EditText? Кнопка «Назад» завершает работу приложения в андроиде с использованием асеплетатора титана ADB не запускается (сообщение об ошибке отсутствует) Как удалить последнюю букву из EditText с помощью кнопки? Android – Как программно отслеживать использование памяти любого запущенного приложения на устройстве? Android Emulator Error ": ERROR: образ пользовательских данных используется другим эмулятором. Прерывание " Есть ли способ установить только ADB без всего SDK? В чем разница между макетом и контейнером в Android? Как выбрать несколько флажков в подменю на Android? Android Design Lib CollapsingToolbarLayout перестает взаимодействовать при касании горизонтального RecyclerView Получить список контактов и статус skype в android «Аппаратный раздел» отсутствует в Android Virtual Device Manager Атрибут «title» уже был определен, если у него есть зависимости от сюжетов Android 1.0.0

ClassCastException: RestTemplate возвращает List <LinkedHashMap> вместо списка <MymodelClass>

Я пытаюсь получить доступ к методам getter на моем MyModelClass, но мой код возвращает List<LinkedHashMap> вместо List<MyModelClass> . Это мой код.

 List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class); System.out.println("Response= " + myModelClass); 

Я попытался напечатать ответ, и я получил ответ JSON, которого ожидаю. Но когда я попытался запустить этот код.

 System.out.println("Response= " + myModelClass.get(0).getMessage()); 

Это приведет к ошибке.

 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.XXX.XXX.MyModelClass 

Это несоответствие. Может ли кто-нибудь помочь мне избавиться от этой ошибки? Благодарю.

MyModelClass

 public class MyModelClass{ /** * */ @JsonProperty("id") public String id; @JsonProperty("type") public String type; @JsonProperty("user") public String user; @JsonProperty("message") public String message; //getters 

Ошибка для

 MyModelClass[] myModelClass= restTemplate.postForObject(url,mvm, myModelClass[].class); 

Org.springframework.http.converter.HttpMessageNotReadableException: не удалось прочитать JSON: невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT

Структура ответа JSON

  [{"key1":"value1","key2":"value2","parameters":{"key1":"value1","key2":"value2","key3":"value3","key4":"value4","key5":"value5"}}, {"key12":"value12","key22":"value22","parameters":{"key12":"value12","key22":"value22","key32":"value32","key42":"value42","key52":"value52"}}] 

Если есть какое-либо предложение о том, как сопоставить этот вид ответа JSON в RestTemplate, это очень поможет. благодаря

Solutions Collecting From Web of "ClassCastException: RestTemplate возвращает List <LinkedHashMap> вместо списка <MymodelClass>"

При следующем вызове метода

 List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class); 

Все, что Джексон знает, это то, что вы хотите List , но не имеете никаких ограничений по типу. По умолчанию Джексон десериализует объект JSON в LinkedHashMap , поэтому вы получаете ClassCastException .

Если ваш возвращенный JSON является массивом, один из способов получить его – использовать массив

 MyModelClass[] myModelClasses = restTemplate.postForObject(url,mvm, MyModelClass[].class); 

Вы всегда можете добавить элементы из этого массива в List .

Я не могу вспомнить, с какой версией, но RestTemplate#exchange теперь имеет перегрузку, которая принимает аргумент ParameterizedTypeReference . ParameterizedTypeReference – это маркер типа token, предлагающий параметризованный тип в качестве цели для десериализации.

Вы можете реорганизовать код выше, чтобы использовать exchange вместо postForObject , и использовать ParameterizedTypeReference для получения List<MyModelClass> . Например

 ParameterizedTypeReference<List<MyModelClass>> typeRef = new ParameterizedTypeReference<List<MyModelClass>>() { }; ResponseEntity<List<MyModelClass>> responseEntity = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(mvm), typeRef); List<MyModelClass> myModelClasses = responseEntity.getBody();