Fastjson转换json到带泛型的对象(如Map)报错解决

it2022-05-05  128

1 问题出现

在跑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>类型

2. 解决

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>>(){});

最新回复(0)