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();