我正在向控制器https://pastebin.com/d4SHZuZh发送请求。 JSON使用此类中的Builder进行反序列化。 @JsonDeserialize(builder = ContributionNewRequest.Builder.class)
该集合的元素是从? extends MovieInfoDTO
继承的MovieInfoDTO
个对象。
从中获取物品时列出elementsToAdd
contribution.getElementsToAdd()
.forEach(boxOffice -> {
...
});
事实证明boxOffice
元素是java.util.LinkedHashMap
对象。
我在互联网上找到了一条提及http://www.baeldung.com/jackson-collection-array的内容,即JSON默认将集合的元素设置为LinkedHashMap
。
我需要做些什么来制作正确类型的对象?
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.jonki.popcorn.common.dto.movie.BoxOffice
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_171]
答案 0 :(得分:2)
您应该自定义反序列化构建器。
尝试这样的事情
public class CustomDeserializer extends StdDeserializer<List<? extends MovieInfoDTO>> {
protected CustomDeserializer(Class<?> vc) {
super(vc);
}
@Override
public List<? extends MovieInfoDTO> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json = jsonParser.getText();
TypeReference type = new TypeReference<List<? extends MovieInfoDTO>>() {};
return objectMapper.readValue(json, type);
}
}
最后在@JsonDeserialize(using = CustomDeserializer.class)
属性
elementsToAdd
希望这会对你有所帮助。
答案 1 :(得分:0)
尝试使用以下代码进行转换。
public <T> List<T> jsonToObjectList(String json, Class<T> tClass) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
List<T> ts = objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass));
return ts;
}