引用 com.alibaba:fastjson:2.0.41 的包,反序列化Map属性的类型时,会解析成JSONObject,例如
类型
public class DemoInfo {
Map<Integer, String> mapInfo;
}
字符串 {"mapInfo":{0:"t0"}}
调用 DemoInfo demoInfo = JSON.parseObject(config, new TypeReference(){}.getType()); 转换成demo对象,
mapInfo属性会被转换成 com.alibaba.fastjson.JSONObject 的类型,JSONObject 继承的是 Map<String, Object>,其泛型要求key为字符串,导致后续 mapInfo.put(1,"t1") 方法报类型转换的错误。
测试引用最新的fastjson2的包 com.alibaba.fastjson2:fastjson2:2.0.41,反序列化时,解析出来的mapInfo是 HashMap类型,是正确的。
测试引用以前版本的 com.alibaba:fastjson:1.2.83 反序列化解析的mapInfo也是 HashMap类型。
应该是 fastjson-2.0.41.jar 的问题,这样会导致从 fastjson-1.2.83.jar 直接升级到 fastjson-2.0.41.jar 不兼容,与 fastjson2-2.0.41.jar也不兼容。
1条答案
按热度按时间polhcujo1#
测试代码
`
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import lombok.Data;
import java.util.Map;
//import com.alibaba.fastjson2.JSON;
//import com.alibaba.fastjson2.TypeReference;
public class JsonTest {
@DaTa
public static class DemoInfo {
Map<Integer, String> mapInfo;
}
}
`
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String