亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Gson(泛型)如何“動態”反序列化類屬性ClassCastException

Gson(泛型)如何“動態”反序列化類屬性ClassCastException

冉冉說 2019-05-23 11:10:54
這個問題實在是不知道怎么取標題異常如下:Exceptioninthread"main"java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMapcannotbecasttoXXX我舉例說明:已知有一個User類,包含了一些簡單的屬性publicclassUser{privateStringuserName;privateStringgender;//getset方法省略}然后我有一個專門用于數據傳輸的json包裝類publicclassJsonMessage{privateIntegercode;privateStringmsg;privateTdata;//getset方法省略}然后我有一個主方法publicstaticvoidmain(String[]args){//有一個待序列化的json字符串StringjsonStr="{'code':123,'msg':'test','data':{'userName':'baofeidyz','gender':'male'}}";//然后使用Gson序列化Gsongson=newGson();JsonMessagemessage=gson.fromJson(jsonStr,JsonMessage.class);//然后在這里我嘗試獲取data中的數據,就報//Exceptioninthread"main"java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMapcannotbecasttoUser}可是當我不使用泛型的時候就是OK的:我這里有一個新的json包裝類publicclassJsonMessage2{privateIntegercode;privateStringmsg;privateUserdata;//getset方法省略}然后我又新建了一個新的main方法:publicstaticvoidmain(String[]args){//還是那個待序列化的json字符串StringjsonStr="{'code':123,'msg':'test','data':{'userName':'baofeidyz','gender':'male'}}";//然后使用Gson序列化Gsongson=newGson();//這里換成了新的包裝類JsonMessage2message=gson.fromJson(jsonStr,JsonMessage2.class);//然后就成功獲取到了數據}代碼是我在segmentfault網頁現敲的,但是問題是和我實際問題一樣。個人覺得主要是我對泛型和Gson的序列化方式理解有問題,所以想請教一下各位,感謝!
查看完整描述

2 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

自問自答了。
我解決了。
在Gson反序列化的過程中,如果你需要傳泛型需要這樣操作:
JsonMessagemessage=gson.fromJson(jsonStr,newTypeToken>(){}.getType());
其實我以前就遇到過這個問題,只是這次發生的場景變了,這個問題實際上是在寫SpringBoot的Controller的時候遇到的
最后的解決方案是修改傳入參數的key,需要和包裝類的屬性名相同才可以,不過建議徹底去除jackson改成集成gson會比較好
然后就可以非常簡單的使用@RequestBody來拿到數據對象
                            
查看完整回答
反對 回復 2019-05-23
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

我試了一下,GSON2.7并沒有出現這個異常。
com.google.code.gson
gson
2.7
                            
查看完整回答
反對 回復 2019-05-23
  • 2 回答
  • 0 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號