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

####问题描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值