反序列化 JSON 对象的集合元素是 LinkedHashMap
Posted
技术标签:
【中文标题】反序列化 JSON 对象的集合元素是 LinkedHashMap【英文标题】:The elements of collections of a deserialized JSON object are LinkedHashMap 【发布时间】:2018-11-06 10:34:12 【问题描述】:我正在向控制器https://pastebin.com/d4SHZuZh 发送请求。使用此类中的 Builder 反序列化 JSON。 @JsonDeserialize(builder = ContributionNewRequest.Builder.class)
集合的元素是从MovieInfoDTO
继承的? extends 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]
【问题讨论】:
【参考方案1】:您应该自定义您的反序列化构建器。
试试这样的
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);
最后在 elementsToAdd
属性之前添加 @JsonDeserialize(using = CustomDeserializer.class)
希望对你有所帮助。
【讨论】:
我需要为list、map和set创建一个反序列化的三个类? 我要如何提交Set <String> tags
,我需要创建另一个类进行反序列化?一般来说,我必须为一个项目创建很多这样的类。【参考方案2】:
尝试使用以下代码进行转换。
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;
【讨论】:
我需要一个更自动化的方法,这样我就不必每次都通过这个方法手动传递对象。好的注释会很好。以上是关于反序列化 JSON 对象的集合元素是 LinkedHashMap的主要内容,如果未能解决你的问题,请参考以下文章
尝试反序列化 JSON 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?
Groovyjson 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )