Gson數據類型轉換異常 java.lang.ClassCastException: com.google.gson.internal.出現原因已經解決方案,
今天寫項目發現了一個用gson做JSON串回List的數據對象時,報了這個錯誤,如下
List<User> userList;
userList=gson.fromJson((jsonStr),List.class);
System.out.println(userList.get(0));
System.out.println(userList.get(0).getUserName());
數據類型轉化異常
但是userList.get(0)確實可以正常拿到相應的數據,但是第4行的,getUserName()卻會報如上的異常。
經過了一番探索之後,發現是因爲Gson在處理Json字符串和對象二者轉換時,對於有泛型的數據類型,需要做一個泛型指定,如 List 等
//先來看一個錯誤的寫法, 0 0 隨便試的 我敢說肯定很多人也試過
//userList=gson.fromJson(jsonStr,List<User>.class);
//正確操作
userList=gson.fromJson(jsonStr,new TypeToken<List<User>>(){}.getType());
通過 newTypeToken<List>(){}.getType() 來指定特定泛型的數據轉換,即可避免發生上面的泛型錯誤,而在未指定泛型的情況下,gson默認的是Map,這也是上面gson裏爲什麼會出現 LinkedTreeMap cannot to be cast to User 的情況。
以上。
還有一個的方法就是把泛型指定這些問題交給Gson自己去處理,在外層封裝一個非泛型的實體類,這也是我之前一直沒發現會出現這個異常的原因,我自己基本上有服務端返回的JSON串都是一個Response類型,在Response類裏將List作爲它的域。
Response response=gson.fromJson(jsonStr,Response.class);
userList=response.getUserList();