我正在尝试访问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
这是不匹配的。有人可以帮我摆脱这个错误吗?谢谢。
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:无法从START_OBJECT token 中反序列化java.util.ArrayList实例
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响应有任何建议,那将有很大帮助。谢谢
最佳答案
用下面的方法调用
List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);
jackson 只知道您想要一个
List
,但是对类型没有任何限制。默认情况下,Jackson将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();