问题: java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法|Java Web后台开发|在线助手,您的在线生成制作工具箱!
问题关键字: java解析泛型json,android解析泛型json,gson解析泛型json,Java Web后台开发,Spring Boot,Spring Mvc,thymeleaf,在线助手,在线工具,!
问题详细描述: java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法是在线助手博客频道,Java Web后台开发系列文章之一,,it399在线助手以及在线助手博客专注于提供在线生成、在线制作等在线工具,以及提供在windows、Mac环境下使用eclipse、intellij idea进行JavaWeb后台开发专栏主要记录了开发过程中SpringBoot报错,SpringMVC报错,thymeleaf模板,vue使用,jsp报错,servlet报错,Mysql数据库报错等常见问题!
在线助手
开发工具
json校验工具
json在线格式化
网页设计工具
在线配色
在线取色器
图片制作工具
图片圆角制作
编码解码
图片工具
gif在线转视频
图片base4编码解码
加密解密
aes加密解密
计算工具
文件Hash在线计算
转换工具
数字大写转换工具
生活工具
二维码工具
彩色二维码在线制作
娱乐工具
朋友圈拆迁补偿协议生成
高考准考证图片在线制作
足迹地图在线生成
推广工具
词云标签云在线生成制作
元宵祝福在线制作
java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法
在线助手博客首页
###Hello world!
####问题描述 * java 解析多层含有泛型对象的json数据获取不到泛型类型 * 如果将泛型改成实际的类型就能正常解析 * 如果不改成实际的类型泛型数据被解析成com.google.gson.internal.LinkedTreeMap * 如果强制转换报错:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.example.vizax.with.bean.BaseBean ####下面是具体的实体类和json数据 **java通用数据模型,含有泛型T** ```java public class PackageModel<T> { public T result; public String message; public int code; } ``` **json数据** ```json { "code": 0, "message": "操作成功", "result": { "accessToken": "17049387C5E8D331CF8B5B2A9805880E", "userId": "241520", "account": "18688888888", "sex": "1", "userName": "号有", "nickName": "测试", "cityName": "天津 河北区", "iconUrl": "https://www.it399.com", "hasDevice": "1", "email": "444445462@qq.com" } } ``` ####如果直接使用传递过去的泛型类型解析,解析不出result **解析代码** ```java Gson gson = new Gson(); PackageModel<T> eventBusModel2 = gson.fromJson(response.body(),PackageModel.class); ``` **解析结果,是map而不是对象**  ####原因:泛型擦除机制 **泛型只在编译期间起作用,运行期间是获取不到泛型信息的。即使我们在运行期间用反射去获取泛型类型,也是无效的。所以不要想着去获取泛型类型了** ####既然无法获取泛型类型,而gson解析又一定要传递具体类型,怎么办呢? * 1.可以通过自定义转换器构造函数传递具体的类型。**比如ok-go源码里面对于json数据的转换,就是通过构造函数传递具体的数据类型的**  * 2.可以通过反射获取方法返回值具体类型 **首先定义请求方法的返回值为具体类型,调用的时候还是传递泛型**  **解析的时候利用反射获取此方法的返回值类型,那么解析json数据的时候就知道具体的类型了** ```java /** * 得到返回实体类型 * @return */ public Type getType() { //获取线程运行栈信息 StackTraceElement stack[] = (new Throwable()).getStackTrace(); //获取请求被发起的地方的方法返回值 StackTraceElement s = stack[3]; String key = s.getMethodName(); final Type type = requestMethods.get(key); return type; } ``` **注意getType的调用地方不同,stack[3]的值也不同,根据实际情况修改下标值** * 3.其它黑科技 ####总结:gson解析一定要传具体的type,传递泛型T是获取不到具体类型的 ------------- [个人网站](https://www.it399.com) [个人博客](https://www.it399.com/blog/index) ------------- > 本文同步发布在 [在线助手](https://www.it399.com) ,**转载请注明来自 [在线助手博客](https://www.it399.com/blog/index) 频道【[java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法](https://www.it399.com/blog/web/201806141400)]】,原文链接**:**https://www.it399.com/blog/web/201806141400**
网站快速导航
json在线格式化
阿拉伯数字转大写
彩色二维码模板
元宵节祝福制作
拆迁补偿协议
彩色二维码生成
Md5|Sha|Crc计算
Aes加密解密
图片base6编码工具
色彩搭配方案
图片取色工具
图片圆角制作工具
足迹地图生成器
词云标签云生成器
高考准考证在线制作
gif在线转视频
我的七夕预测
在线助手博客
Web后台开发
Web前端开发
Android移动开发
Python开发
linux运维开发
ffmpeg编码解码
赵丽颖冯晓峰
返回顶部
扫一扫,体验小程序
下载Android客户端
-
-
-
Copyright © 2017-2018 . All Rights Reserved.
粤ICP备18008506号