####问题描述

* 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 {

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 eventBusModel2 = gson.fromJson(response.body(),PackageModel.class);

```

**解析结果,是map而不是对象**

![图片.png](https://upload-images.jianshu.io/upload_images/2704327-cd8427c43f4a40c6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####原因:泛型擦除机制

**泛型只在编译期间起作用,运行期间是获取不到泛型信息的。即使我们在运行期间用反射去获取泛型类型,也是无效的。所以不要想着去获取泛型类型了**

####既然无法获取泛型类型,而gson解析又一定要传递具体类型,怎么办呢?

* 1.可以通过自定义转换器构造函数传递具体的类型。**比如ok-go源码里面对于json数据的转换,就是通过构造函数传递具体的数据类型的**

![图片.png](https://upload-images.jianshu.io/upload_images/2704327-1c0d4e1704a4150a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/800)

* 2.可以通过反射获取方法返回值具体类型

**首先定义请求方法的返回值为具体类型,调用的时候还是传递泛型**

![图片.png](https://upload-images.jianshu.io/upload_images/2704327-4195f9dd223ef509.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**解析的时候利用反射获取此方法的返回值类型,那么解析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**

android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...相关推荐

  1. android notifydatasetchanged 刷新错误,Android 调用notifyDataSetChanged方法失败解决办法

    Android 调用notifyDataSetChanged方法失败解决办法 如果使用ListView.GridView等进行数据展示,当绑定的数据有了更新的时候,需要实时刷新ListView,即调用 ...

  2. 【Android】APP嵌入百度地图骑行导航一直初始化引擎失败解决办法

    [Android] APP嵌入百度地图骑行导航一直初始化引擎失败解决办法 最近手头上有个需求需要做骑行导航 首先百度地图开放平台http://lbsyun.baidu.com/ 按提示找到Androi ...

  3. Android Studio 自动更新失败解决办法

    Android Studio 自动更新失败解决办法 Dec 26th, 2014 | Comments 昨天在G+中看到Android Studio又有更新了就心血来潮想去更新体验一下,可是无论我怎么 ...

  4. java HelloWorld时报错:“找不到或无法加载主类“问题的解决办法

    java HelloWorld时报错:"找不到或无法加载主类"问题的解决办法 参考文章: (1)java HelloWorld时报错:"找不到或无法加载主类"问 ...

  5. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  6. Android之华为meta10 pro安卓8.0绑定服务(bindService)失败解决办法

    1.问题 Intent intent = new Intent("com.gsta.ukeyesurfing.service.UkeyService"); boolean resu ...

  7. Android真机界面的大小与MuMu模拟器运行出来的手机屏幕大小不一致问题的一个解决办法

    –最近在做毕业设计,作为一个新手遇到了这个屏幕大小问题,最后用了"土办法"可算是解决了.我的手机是小米6x,屏幕大小是1080乘2160.刚开始我把MuMu模拟器界面大小调至108 ...

  8. android安卓手机(小米 MI3联通版)安装Ubuntu(Linux发行版)过程遇到的坑以及解决办法。

    原创博客,转载请注明出处,欢迎转载. 以下是我用闲置的旧手机小米3联通版根据网上教程安装Ubuntu过程,以及各种问题的解决办法: (请直接跳到第三步:使用Linux Deploy安装ubuntu) ...

  9. Android 10 获取图片失败解决办法

    1. 前言 从 Android Q(10.0) sdk>=29 开始,系统为每个 app 提供了一个隔离环境(分区存储) 若想访问自己分区外的图片等,需要通过Android自带的媒体集合 参考网 ...

最新文章

  1. 超市购物打印小票的简单程序 记录下来
  2. 漫画:什么是 HTTPS 协议?
  3. 简便的chrome插件安装
  4. Java 多重catch语句的使用
  5. C语言 删除文件 M,最全的C盘可删除文件清单
  6. 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击
  7. jupyter下Tensorflow-ssd测试整体流程,以及问题no module name**的解决
  8. Centos7.4系统下安装httpd,mariadb,php7.1环境运行禅道
  9. matlab中fval函数,请问matlab中[x,fval,exitflag,output] = simulannealbnd(fun,...)函数怎么调用...
  10. AI加持 百度输入法语音识别准确率相对提升15%
  11. 版本为2.5的OpenMP的所有API函数
  12. Oracle Database 12c 新特性:RAC Cluster Hub Node 和 Leaf Node
  13. antd 轮播图样式_antd-design 的轮播图组件Carousel如何在初始化的时候自动跳转到特定图片...
  14. arraylist有顺序吗_美团Java研发岗二面:什么叫线程安全?servlet是线程安全吗?...
  15. HTML 网页制作 盒子设计 CSS
  16. springboot高校学生健康打卡系统的设计与实现毕业设计源码021009
  17. adaway的jni设计摸索
  18. R语言logistic回归的细节解读
  19. Java线程的死锁和活锁
  20. 红米5a手机html查看器,红米5A如何截图 红米5A手机截图方法【详细介绍】

热门文章

  1. 万字长文!Unix和Linux你不知道的那些历史(详解版)
  2. Storm精华问答 | 如何处理常见故障?
  3. svg入门经典pdf_机器学习最好的入门课程是什么?
  4. Vue刷新当前页面几种方式
  5. Oracle给表和字段添加注释
  6. rsync一行代码实现远程文件同步之修改默认22端口
  7. JBOSS7启动与关闭
  8. Guns 查询列表_入门试炼03
  9. Vue 组件开发 - 数据输入框组件
  10. python解常微分方程_Python-sympy.dsolve求解常微分方程(组)