ClassCastException:RestTemplate返回List<LinkedHashMap>而不是List<MymodelClass>

我正在尝试在我的MyModelClass上访问getter方法,但我的代码返回而不是.这是我的代码。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 

这是一个不匹配。有人可以帮我摆脱这个错误吗?谢谢。

我的模型类

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 token

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"}}]

如果有任何关于如何在RestTemplate中映射这种JSON响应的建议,那将有很大帮助。谢谢


答案 1

使用以下方法调用

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

Jackson 所知道的是,你想要一个 ,但对类型没有任何限制。默认情况下,Jackson 将 JSON 对象反序列化为 ,因此这就是您获取 .ListLinkedHashMapClassCastException

如果返回的 JSON 是一个数组,则获取它的一种方法是使用数组

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

您始终可以将该数组中的元素添加到 .List

我不记得从哪个版本开始,但是RestTemplate#exchange现在有一个接受参数化TypeReference参数的重载。是类型令牌 hack,用于建议将参数化类型作为反序列化的目标。ParameterizedTypeReference

您可以重构上面的代码以代替 ,并用于获取 .例如exchangepostForObjectParameterizedTypeReferenceList<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();

答案 2

使用以下方法调用 ,您可以转换为LinkedHashMapList

ObjectMapper mapper = new  ObjectMapper();
List<Object> list = mapper.convertValue(listResponse, new TypeReference<List<Object>>() {})

推荐