成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

當(dāng)JSON解析遇上了泛型,該如何處理泛型擦除問題

開發(fā) 前端
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,簡(jiǎn)潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言,常被用于實(shí)際項(xiàng)目中。下面本文主要通過一個(gè)實(shí)際案例討論分析在解析JSON字符串的過程中遇到泛型該如何處理。

JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,簡(jiǎn)潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言,常被用于實(shí)際項(xiàng)目中。Java生態(tài)圈中有很多處理JSON格式化的類庫,如json-lib框架、Jackson、Google的Gson、阿里的FastJson等,通過這些類庫可以使我們更加簡(jiǎn)便地處理JSON。下面本文主要通過一個(gè)實(shí)際案例討論分析在解析JSON字符串的過程中遇到泛型該如何處理。

  • 案例描述
  • 問題引出
  • 處理方案
  • 原理分析

一、案例描述

首先介紹三個(gè)類,為了便于理解將代碼省去非關(guān)鍵部分。

  • PrepCommonResp 是一個(gè)通用響應(yīng)類,為了支持多種返回類型,設(shè)置了其中一個(gè)屬性result為泛型。
    1. public class PrepCommonResp<T> { 
    2.  private T result; //獲取調(diào)用返回值 
    3.  private String code = "000000"; //獲取錯(cuò)誤碼 
    4.  private String msg = "Success"
    5. //這里省略getter setter等 
  • LeaderboardResp 是一個(gè)Leaderboard接口響應(yīng)類,其中有一個(gè)屬性是一個(gè)List集合集合中的對(duì)象為L(zhǎng)eaderboardPojo
    1. public class LeaderboardResp implements Serializable { 
    2.  List<LeaderboardPojo> leaderboardList; 
    3.  //這里省略getter setter等 
  • LeaderboardPojo 是一個(gè)實(shí)體類
    1. public class LeaderboardPojo { 
    2. //基本屬性 

需求:將一個(gè)JSON字符串的String類型數(shù)據(jù)解析到指定了泛型的通用響應(yīng)類實(shí)例PrepCommonResp對(duì)象中。

[[275804]]

二、問題引出

一開始編寫時(shí),采用了Jackson的ObjectMapper類readValue方法來進(jìn)行解析,具體代碼如下。

  1. ObjectMapper mapper = new ObjectMapper(); 
  2. PrepCommonResp<LeaderboardResp> resp = mapper.readValue(result,PrepCommonResp.class); 

我們期待的結(jié)果是JSON字符串被正確解析,并且result屬性的值是以指定泛型LeaderboardResp的格式存儲(chǔ)。但是通過斷點(diǎn)之后我們發(fā)現(xiàn)result屬性的值是以LinkedHashMap的形式存儲(chǔ),與期望結(jié)果不符。

當(dāng)JSON解析遇上了泛型該如何處理泛型擦除問題

三、解決方案

在分析原因之前,先來說說解決方式。解決方式有多種,我們通過了嘗試對(duì)比了各種方案之后選擇了其中一種較為簡(jiǎn)便的就是采用Gson的fromJson方法來解決,具體代碼如下:

  1. //嘗試使用Gson 
  2. Gson gson = new Gson(); 
  3. PrepCommonResp<LeaderboardResp> resp = gson.fromJson(result, new TypeToken<PrepCommonResp<LeaderboardResp>>(){}.getType()); 
  4. List<LeaderboardPojo> list = resp.getResult().getLeaderboardList(); 

運(yùn)行結(jié)果如下,result的值以我們期望的LeaderboardResp形式存儲(chǔ)

當(dāng)JSON解析遇上了泛型該如何處理泛型擦除問題

四、原理分析

1. 先理解泛型與編譯器虛擬機(jī)的關(guān)系以及什么是擦除?

解析: Java語言的泛型基本上是在編譯器中實(shí)現(xiàn)的。由編譯器執(zhí)行類型檢測(cè)和推斷后生成普通的非泛型的字節(jié),虛擬機(jī)是完全無感知泛型存在的,這種實(shí)現(xiàn)技術(shù)稱為擦除。編譯器使用泛型類型信息保證類型安全,然后在生成字節(jié)碼之前將其清除。

[[275805]]

2. 為什么使用Jackson的readValue方法解析JSON字符串后result的屬性值會(huì)是LinkedHashMap而不是我們指定的LeaderboardResp呢?

解析:泛型只在編譯期間起到檢測(cè)作用,當(dāng)編譯器將泛型類編譯完成之后,泛型類的類型參數(shù)都被全部擦除。接下來在運(yùn)行期間虛擬機(jī)并不知道泛型的存在,當(dāng)對(duì)JSON字符串進(jìn)行解析時(shí)由于泛型被擦除了導(dǎo)致虛擬機(jī)并不知道要將其解析成哪種類型,所以就解析為了默認(rèn)的LinkedHashMap類型,導(dǎo)致出現(xiàn)了上面的場(chǎng)景。

3. 那Gson是如何解決泛型擦除這種情況呢?

我們來看看這一句核心代碼

  1. PrepCommonResp<LeaderboardResp> resp = gson.fromJson(result, new TypeToken<PrepCommonResp<LeaderboardResp>>(){}.getType()); 

解析:Gson的做法非常巧妙,如上面的代碼所示,將需要獲取類型的泛型類作為TypeToken的泛型參數(shù)構(gòu)造一個(gè)匿名的子類,然后通過getType()方法就可以獲取到我們想要的泛型類的泛型參數(shù)類型。可以理解為是將泛型類型存起來,解決了泛型擦除的問題。

五、最后

感謝您的閱讀,如果喜歡本文歡迎關(guān)注和轉(zhuǎn)發(fā),本頭條號(hào)將持續(xù)分享IT技術(shù)知識(shí)。對(duì)于文章內(nèi)容有其他想法或意見建議等,歡迎提出共同討論共同進(jìn)步。如果您對(duì)于此場(chǎng)景有更好的解決方案也歡迎提出討論。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2024-03-06 08:17:18

Java泛型安全

2021-07-01 06:47:30

Java泛型泛型擦除

2023-03-06 08:33:24

IDEA反編譯類型

2020-12-21 16:18:07

JavaTypeToken泛型擦除

2009-08-24 10:07:57

C#泛型處理

2020-10-20 10:17:20

Java泛型Type

2021-09-29 18:17:30

Go泛型語言

2022-03-02 14:41:03

泛型反序列化

2021-07-29 09:20:18

Java泛型String

2025-05-30 02:31:00

2023-01-05 17:13:28

TypeScript泛型組件

2009-09-25 10:03:51

Java泛型

2020-10-26 14:01:22

Java泛型

2009-08-26 18:02:05

C#泛型問題

2024-06-07 10:05:31

2021-08-24 08:05:41

泛型類型擦除Class

2023-11-29 08:19:45

Go泛型缺陷

2021-06-17 06:51:32

Java泛型Java編程

2025-01-24 08:19:57

2024-01-15 08:28:31

Spring事件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜激情影院 | 色综合一区二区三区 | 性高湖久久久久久久久3小时 | 久热精品在线观看视频 | 欧美综合一区二区三区 | 亚洲综合无码一区二区 | 久久久久国产精品午夜一区 | 亚洲免费一区二区 | 超碰av在线 | 91精品国产欧美一区二区 | 亚洲三区在线 | 国产成人a亚洲精品 | 久久精品福利视频 | 一区二区三区亚洲精品国 | 亚洲精品一区二区三区丝袜 | 亚洲精品久久久一区二区三区 | 黄色毛片一级 | 亚洲91视频 | 2018天天干天天操 | 国产中文 | 欧美一区二区大片 | 91人人视频在线观看 | 97伦理| 一区二区三区在线 | 精品无码三级在线观看视频 | 欧美在线视频网站 | 99久久婷婷国产综合精品首页 | 99热这里 | 午夜成人免费视频 | 国产精品久久久久久久久久久久 | 国产丝袜av| 羞羞色网站 | 亚洲国产中文在线 | 日韩在线播放一区 | 日韩三级在线 | 国产亚洲欧美另类一区二区三区 | 亚州精品天堂中文字幕 | 久久免费大片 | 中文久久 | 黄色片视频 | 久久九精品 |