
ObjectMapper List子类序列化和注解使用说明记录
前言
三代项目中有一个LogicList来装所有的结果什么什么的,直接继承ArrayList,同时还有一个属性currentRowNumber
来记录当前索引,这样的话遍历啊,表达式获取都比较方便,但是使用ObjectMapper
的convertValue
的时候就会出现问题。每个LogicList都被转成了ArrayList,导致后面的一些操作就会报错,类型不一致
解决
通过查看ObjectMapper
的配置,发现有一个方法addAbstractTypeMapping
,于是new一个SimpleModule
并module.addAbstractTypeMapping(List.class, LogicList.class);
回去重试发现已经解决问题。因为项目中没有ArrayList
,只有跟LogicList
,所以可以放心映射
完整代码:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customJackson(Collection<Module> moduleBeans) {
return jacksonObjectMapperBuilder -> {
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addDeserializer(LocalDateTime.class, new JsonDeserializer<>() {
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String valueAsString = p.getValueAsString();
if (Pattern.matches("\\d{4}-\\d{2}-\\d{2}", valueAsString)) {
valueAsString += " 00:00:00";
}
return LocalDateTime.parse(valueAsString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
});
javaTimeModule.addSerializer(BigDecimal.class, new JsonSerializer<>() {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.toString());
}
});
SimpleModule module = new SimpleModule("LogicListSerializer", Version.unknownVersion());
module.addAbstractTypeMapping(List.class, LogicList.class);
List<Module> modules = new ArrayList<>(moduleBeans);
modules.add(javaTimeModule);
modules.add(module);
jacksonObjectMapperBuilder.modulesToInstall(modules.toArray(new Module[0]));
};
}
子类待补 registerSubtypes
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Henry's Lib
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果