在跑demo的时候,写了个读取json,然后转换成HashMap的代码,结果发现fastjson报了类型转换异常:
private static HashMap<String,ErrorDto> errorCodeCache; static { String s = FileUtil.readResourceFile(ERROR_JSON_PATH); HashMap hashMap = JSON.parseObject(s, HashMap.class); errorCodeCache = hashMap; }异常信息:
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.zgd.shop.core.error.ErrorDto at com.zgd.shop.core.error.ErrorCache.getMsg(ErrorCache.java:40) ~[classes/:na] at com.zgd.shop.core.result.ResultUtil.getResult(ResultUtil.java:89) ~[classes/:na] at com.zgd.shop.core.result.ResultUtil.failure(ResultUtil.java:71) ~[classes/:na] at com.zgd.shop.core.result.ResultUtil.failure(ResultUtil.java:50) ~[classes/:na]
因为fastjson转换对象,方法是JSON.parseObject(String json,Class clazz),这个方法又没办法指定我们需要转换的具体类型
比如我们想要得到的结果是HashMap<String,ErrorDto>, 但是因为parseObject没有指定泛型,所以
通过debug,可以看到json解析后,是一个HashMap<String,JsonObject>类型
fastjson除了上面的方法外,还重载了一个方法
public static <T> T parseObject(String text, TypeReference<T> type, Feature... features){}就是这个TypeReference,修改后代码:
HashMap<String,User> map = JSON.parseObject(s, new TypeReference<HashMap<String,User>>(){});