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

这个问题实在是不知道怎么取标题
异常如下:
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的序列化方式理解有问题,所以想请教一下各位,感谢!
牛魔王的故事
浏览 391回答 2
2回答

翻过高山走不出你

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

梦里花落0921

我试了一下,GSON2.7并没有出现这个异常。com.google.code.gsongson2.7
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript