Open SevenZhou opened 10 months ago
测试代码 ` 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; }
public static void main(String[] args) {
String demoStr = "{\"mapInfo\":{0:\"t0\"}}";
DemoInfo demoInfo = JSON.parseObject(demoStr, new TypeReference<DemoInfo>(){}.getType());
System.out.println(demoInfo);
System.out.println(demoInfo.getMapInfo().getClass());
demoInfo.getMapInfo().put(1,"t1");
}
} `
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
引用 com.alibaba:fastjson:2.0.41 的包,反序列化Map属性的类型时,会解析成JSONObject,例如 类型 public class DemoInfo { Map<Integer, String> mapInfo; }
字符串 {"mapInfo":{0:"t0"}}(){}.getType()); 转换成demo对象,
mapInfo属性会被转换成 com.alibaba.fastjson.JSONObject 的类型,JSONObject 继承的是 Map<String, Object>,其泛型要求key为字符串,导致后续 mapInfo.put(1,"t1") 方法报类型转换的错误。
调用 DemoInfo demoInfo = JSON.parseObject(config, new TypeReference
测试引用最新的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也不兼容。