1 前言
以前用Jackson序列化和反序列化时都只是简单的当工具用,在将对象转成Map形式时遇到一个转换检查的问题,于是就日常记录一下。
2 问题描述
当前我们有两个类:类Arguments包含字段有String、Long、Integer类型;
类Response包含一个Arguments的Map字段,key和value都是String类型
然后在main函数中,我们通过Jackson的convertvalue()希望将Arguments对象转成Map<String, String>。
但是注意到,如果不指定Map的具体类型(即只指定Map.class),Jackson其实是不会对转换的Map<String, String>做字段类型检查,也就是说转换后的argumentsMap的value仍然是和Arguments对应字段类型保持一致,而不是String类型。
但是Response里是直接set了这个argumentsMap,这样后面对Response序列化或通过get()获取字段的value值时会报错,形如:Long can not cast to String。
3 结论
1)如果需要避免后面字段转换异常,最好使用Jackson的TypeReference方式保证一致
@Data
public class Arguments {
private String name;
private Long id;
private Integer