####問題描述
* 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而不是對象**

####原因:泛型擦除機制
**泛型只在編譯期間起作用,運行期間是獲取不到泛型信息的。即使我們在運行期間用反射去獲取泛型類型,也是無效的。所以不要想著去獲取泛型類型了**
####既然無法獲取泛型類型,而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**