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