为了账号安全,请及时绑定邮箱和手机立即绑定

Gson(泛型)如何“动态”反序列化类属性ClassCastException

Gson(泛型)如何“动态”反序列化类属性ClassCastException

大话西游666 2019-05-23 11:20:10
这个问题实在是不知道怎么取标题异常如下: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贡献1824条经验 获得超5个赞

自问自答了。
我解决了。
在Gson反序列化的过程中,如果你需要传泛型需要这样操作:
JsonMessagemessage=gson.fromJson(jsonStr,newTypeToken>(){}.getType());
其实我以前就遇到过这个问题,只是这次发生的场景变了,这个问题实际上是在写SpringBoot的Controller的时候遇到的
最后的解决方案是修改传入参数的key,需要和包装类的属性名相同才可以,不过建议彻底去除jackson改成集成gson会比较好
然后就可以非常简单的使用@RequestBody来拿到数据对象
                            
查看完整回答
反对 回复 2019-05-23
?
慕容森

TA贡献1853条经验 获得超18个赞

我试了一下,GSON2.7并没有出现这个异常。
com.google.code.gson
gson
2.7
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号