反序列化JSON对象的集合元素是LinkedHashMap

时间:2018-05-27 20:14:03

标签: java json spring spring-mvc spring-boot

我正在向控制器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]

2 个答案:

答案 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;
        }