日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/8 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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**

總結

以上是生活随笔為你收集整理的android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。