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

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

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

牛魔王的故事 2019-05-23 10:59:35
这个问题实在是不知道怎么取标题异常如下: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贡献1875条经验 获得超3个赞

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

TA贡献1772条经验 获得超6个赞

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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信