问题: 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数据库报错等常见问题!
二三九九
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而不是对象** ![图片.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客户端
Copyright © 2017-2018 . All Rights Reserved.
粤ICP备18008506号