最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最全Gson使用

 更新時(shí)間:2023年05月23日 15:42:12   作者:Liberuman  
GSON彌補(bǔ)了JSON的許多不足的地方,在實(shí)際應(yīng)用中更加適用于Java開發(fā),本文主要介紹了最全Gson使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Gson是Google開源的一個(gè)JSON庫(kù),被廣泛應(yīng)用在Android開發(fā)中。

說(shuō)明:以下所有的用法都基于Account類!

public class Account {
?? ?private String uid;
?? ?private String userName;
?? ?private String password;
?? ?private String telNumber;
?? ?public Account(String uid, String userName, String telNumber) {
?? ??? ?this.uid = uid;
?? ??? ?this.userName = userName;
?? ??? ?this.telNumber = telNumber;
?? ?}
?? ?@Override
?? ?public String toString() {
?? ??? ?return "Account [uid=" + uid + ", userName=" + userName + ", password=" + password + ", telNumber=" + telNumber
?? ??? ??? ??? ?+ "]";
?? ?}
}

基礎(chǔ)用法

集成Gson

dependencies {
  implementation 'com.google.code.gson:gson:2.8.5'
}

創(chuàng)建Gson對(duì)象

Gson提供了兩種創(chuàng)建對(duì)象的方式:

直接使用Gson構(gòu)造方法創(chuàng)建;

Gson gson = new Gson();

使用GsonBuilder創(chuàng)建;

Gson gson = new GsonBuilder().create();

相比直接使用構(gòu)造方法,GsonBuilder創(chuàng)建的方式更靈活,因?yàn)樗С謱?duì)Gson的配置。

將對(duì)象轉(zhuǎn)換為JSON

Account account = new Account("00001", "Freeman", "13000000000");
System.out.println(gson.toJson(account));
ArrayList<Account> accountList = new ArrayList<Account>();
accountList.add(account);
System.out.println(gson.toJson(accountList));

結(jié)果:

{"uid":"00001","userName":"Freeman","telNumber":"13000000000"}
[{"uid":"00001","userName":"Freeman","telNumber":"13000000000"}]

將JSON轉(zhuǎn)換為對(duì)象

由于Java中的泛型存在類型擦除的問(wèn)題,所以使用泛型接收J(rèn)SON解析結(jié)果的時(shí)候有點(diǎn)特殊。

普通對(duì)象解析

String json = "{\"uid\":\"00001\",\"userName\":\"Freeman\",\"telNumber\":\"13000000000\"}";
Account receiveAccount = gson.fromJson(json, Account.class);
System.out.println(receiveAccount.toString());

結(jié)果:

Account [uid=00001, userName=Freeman, password=null, telNumber=13000000000]

泛型對(duì)象解析

String listJson = "[{\"uid\":\"00001\",\"userName\":\"Freeman\",\"telNumber\":\"13000000000\"}]";
List receiveAccountList = gson.fromJson(listJson, new TypeToken<List<Account>>(){}.getType());
System.out.println("receiveAccountList size = " + receiveAccountList.size());

結(jié)果:

receiveAccountList size = 1

字段復(fù)用

在開發(fā)中有時(shí)會(huì)對(duì)Bean對(duì)象進(jìn)行復(fù)用,但可能有幾個(gè)字段的命名和當(dāng)前的對(duì)象不一致,這樣在解析JSON的時(shí)候就不能正確賦值。Gson提供了字段復(fù)用功能——@SerializedName,可用一個(gè)字段接收不同的JSON字段。

// json字符串中手機(jī)號(hào)的字段為phone或telNumber時(shí)都可正確解析
@SerializedName("phone")
private String telNumber;
// json字符串中用戶名的字段為userName、user_name、uname或u_name時(shí)都可正確解析
@SerializedName(value = "userName", alternate = {"user_name", "uname", "u_name"})
private String userName;

Gson配置

除了以上用法,Gson還提供了豐富的配置選項(xiàng),包括:空值過(guò)濾,字段命名規(guī)則,自定義解析器,自定義序列化/反序列化等。

空值問(wèn)題

Gson默認(rèn)情況下會(huì)過(guò)濾空值字段,但有時(shí)在提交數(shù)據(jù)給后臺(tái)時(shí),即便字段為空,也需要傳給后臺(tái),此時(shí)可通過(guò)GsonBuilder進(jìn)行配置。

gson = new GsonBuilder().serializeNulls().create();
Account account = new Account("00001", "Freeman", "13000000000");
System.out.println(gson.toJson(account));

結(jié)果:

{"uid":"00001","userName":"Freeman","password":null,"phone":"13000000000"}

從結(jié)果可以看出,password字段被輸出了,而前面直接創(chuàng)建Gson轉(zhuǎn)換的時(shí)候沒有輸出password字段。

字段命名轉(zhuǎn)換規(guī)則

因?yàn)椴煌恼Z(yǔ)言使用不同的命名規(guī)則,這會(huì)出現(xiàn)為了正確解析JSON字符串,而使用不符合命名規(guī)則的字段名。如PHP使用小寫字母下劃線分割的命名方式,而Java使用駱駝命名的方式,這樣Android程序在接收J(rèn)SON字符串的時(shí)候就需要使用小寫字母下劃線分割的命名方式,然而這并不符合Java的命名規(guī)范。為了解決這個(gè)問(wèn)題,Gson提供了豐富的字段命名規(guī)則。

// 默認(rèn)的字段轉(zhuǎn)換規(guī)則,字段名不變
FieldNamingPolicy.IDENTITY()
// 將json中的字段名轉(zhuǎn)換為首字母大寫的格式
FieldNamingPolicy.UPPER_CAMEL_CASE()
如:"user_name" -> "UserName"
// 將json中的字段名轉(zhuǎn)換為首字母大寫,單詞之間以空格分割的格式
FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES()
如:"user_name" -> "User Name"
// 將json中的字段名轉(zhuǎn)換為小寫字母,單詞之間以下劃線分割的格式
FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES()
如:"UserName" -> "user_name"
// 將json中的字段名轉(zhuǎn)換為小寫字母,單詞之間以分隔線分割的格式
FieldNamingPolicy.LOWER_CASE_WITH_DASHES()
如:"UserName" -> "user-name"

所以對(duì)于服務(wù)器是PHP的情況,Android端可使用FieldNamingPolicy.UPPER_CAMEL_CASE轉(zhuǎn)換規(guī)則。

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
    .create();

當(dāng)然,如果上面幾種命名轉(zhuǎn)換規(guī)則不滿足需求,也可自定義命名轉(zhuǎn)換規(guī)則,只需要實(shí)現(xiàn)FieldNamingStrategy接口,并完善translateName方法即可。需要注意的是,命名轉(zhuǎn)換規(guī)則會(huì)同時(shí)被應(yīng)用于序列化和反發(fā)序列化,所以在將對(duì)象轉(zhuǎn)換為JSON(序列化)傳給后臺(tái)時(shí)需要注意。

字段過(guò)濾

默認(rèn)情況下,Gson將對(duì)象轉(zhuǎn)換為JSON時(shí),會(huì)將所有非null字段進(jìn)行轉(zhuǎn)換,但有時(shí)為了業(yè)務(wù)需求,通常會(huì)添加一些狀態(tài)字段,如表示item選中狀態(tài)的isSelected,這些字段通常不希望被轉(zhuǎn)換。Gson提供了多種過(guò)濾方式,這里說(shuō)說(shuō)兩種最常用的。

通過(guò)修飾符過(guò)濾

Gson gson = new GsonBuilder()
// 過(guò)濾transient或static修飾的字段,
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.STATIC).create();

自定義過(guò)濾規(guī)則

通過(guò)實(shí)現(xiàn)setExclusionStrategies接口來(lái)定義過(guò)濾規(guī)則:

ExclusionStrategy strategy = new ExclusionStrategy() {
?? ?@Override
?? ?public boolean shouldSkipClass(Class<?> arg0) {
?? ??? ?// 過(guò)濾指定的類
?? ??? ?return false;
?? ?}
?? ?@Override
?? ?public boolean shouldSkipField(FieldAttributes arg0) {
?? ??? ?// 過(guò)濾指定的字段
?? ??? ?return false;
?? ?}
};
Gson gson = new GsonBuilder()
?? ?// 過(guò)濾規(guī)則同時(shí)適用于序列化/反序列化
?? ?.setExclusionStrategies(strategy)
?? ?// 過(guò)濾規(guī)則只適用于序列化
?? ?.addSerializationExclusionStrategy(strategy)
?? ?// 過(guò)濾規(guī)則只適用于反序列化
?? ?.addDeserializationExclusionStrategy(strategy)
?? ?.create();

字段容錯(cuò)性

字段容錯(cuò)性主要表現(xiàn)在字段的類型不匹配,比如接收的字段是整型,返回的卻是字符串或者null, 這種情況情況直接使用String接收整型倒可以解決,但對(duì)于接收類型是數(shù)組,返回的確是對(duì)象的情況,卻不能直接使用類型兼容來(lái)處理。

雖然這些情況都是因?yàn)楹笈_(tái)數(shù)據(jù)格式的問(wèn)題,但對(duì)用戶最直觀的感受是APP閃退了。所以我們需要對(duì)JSON的解析過(guò)程做一定的兼容處理,以防出現(xiàn)異常數(shù)據(jù)時(shí)導(dǎo)致APP閃退。

開發(fā)中經(jīng)常遇到的類型兼容問(wèn)題匯總:

  • 使用Number類型接收,返回了String或空值(Gson已處理此類問(wèn)題);
  • 使用數(shù)組接收,返回了對(duì)象類型;

Gson提供了多種序列化/反序列化方式,由于這里我們只做JSON解析(即反序列化)的兼容處理,所以直接實(shí)現(xiàn)JsonDeserializer接口即可。

// 為數(shù)組類型自定義反序列化適配器
JsonDeserializer<List<?>> listDeserial = new JsonDeserializer<List<?>>() {
?? ?@Override
?? ?public List<?> deserialize(JsonElement arg0, java.lang.reflect.Type arg1,
?? ??? ??? ?JsonDeserializationContext arg2) throws JsonParseException {
?? ??? ?if (arg0.isJsonArray()) {
?? ??? ??? ?JsonArray jsonArray = arg0.getAsJsonArray();
?? ??? ??? ?if (jsonArray.size() == 0) {
?? ??? ??? ??? ?return Collections.EMPTY_LIST;
?? ??? ??? ?}
?? ??? ??? ?List<?> resultList = new ArrayList<>();
?? ??? ??? ?for (JsonElement element : jsonArray) {
?? ??? ??? ??? ?resultList.add(arg2.deserialize(element, arg1));
?? ??? ??? ?}
?? ??? ??? ?return resultList;
?? ??? ?} else {
?? ??? ??? ?return Collections.EMPTY_LIST;
?? ??? ?}
?? ?}
};
Gson gson = new GsonBuilder()
? ? // 注冊(cè)自定義的反序列化適配器
?? ?.registerTypeHierarchyAdapter(List.class, listDeserial)
?? ?.create();

Gson常用配置總結(jié)

gson = new GsonBuilder()
    // 不過(guò)濾空值
    .serializeNulls()
    // 設(shè)置字段命名轉(zhuǎn)換規(guī)則
    .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
    // 設(shè)置字段序列化/反序列化過(guò)濾規(guī)則
    .excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.STATIC)
    // 自定義類型解析器,提高Gson容錯(cuò)性
    .registerTypeHierarchyAdapter(List.class, listDeserial)
    .create();

總結(jié)

到此這篇關(guān)于最全Gson使用的文章就介紹到這了,更多相關(guān)Gson使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 4種java復(fù)制文件的方式

    4種java復(fù)制文件的方式

    本篇文章列舉了4種最受歡迎的java復(fù)制文件的方式,復(fù)制文件是一個(gè)重要的操作,需要的朋友可以參考下
    2015-07-07
  • 詳解如何將springboot項(xiàng)目導(dǎo)出成war包

    詳解如何將springboot項(xiàng)目導(dǎo)出成war包

    這篇文章主要介紹了詳解如何將springboot項(xiàng)目導(dǎo)出成war包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 基于BIO的Java Socket通信詳解

    基于BIO的Java Socket通信詳解

    這篇文章主要為大家詳細(xì)介紹了基于BIO的Java Socket通信相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • JAVA 添加、修改和刪除PDF書簽的示例代碼

    JAVA 添加、修改和刪除PDF書簽的示例代碼

    這篇文章主要介紹了JAVA 添加、修改和刪除PDF書簽的示例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • SpringBoot集成kaptcha驗(yàn)證碼

    SpringBoot集成kaptcha驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了SpringBoot集成kaptcha驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java中創(chuàng)建對(duì)象的5種方式總結(jié)

    Java中創(chuàng)建對(duì)象的5種方式總結(jié)

    本篇文章主要介紹了Java中創(chuàng)建對(duì)象的5種方式總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 使用mvn?deploy命令上傳jar包的實(shí)現(xiàn)

    使用mvn?deploy命令上傳jar包的實(shí)現(xiàn)

    本文介紹了使用mvndeploy:deploy-file命令將本地倉(cāng)庫(kù)中的JAR包重新發(fā)布到Maven私服,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Java反射與注解的詳細(xì)講解(含代碼)

    Java反射與注解的詳細(xì)講解(含代碼)

    注解和反射應(yīng)該說(shuō)是后期JAVA開發(fā)里面比較重要的技術(shù)了,通過(guò)注解和反射可以簡(jiǎn)化許許多多的操作和步驟,最重要的是為JAVA的運(yùn)行提供了更多的靈活性,這篇文章主要介紹了Java反射與注解的詳細(xì)講解,需要的朋友可以參考下
    2026-06-06
  • java(Java?25?LTS)的下載、安裝、配置圖文教程?(IDEA?2025?為例)

    java(Java?25?LTS)的下載、安裝、配置圖文教程?(IDEA?2025?為例)

    在Java開發(fā)中選擇合適的JDK版本至關(guān),重要這篇文章主要介紹了java(Java?25?LTS)的下載、安裝、配置的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • 聊聊spring @Transactional 事務(wù)無(wú)法使用的可能原因

    聊聊spring @Transactional 事務(wù)無(wú)法使用的可能原因

    這篇文章主要介紹了spring @Transactional 事務(wù)無(wú)法使用的可能原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

望江县| 安吉县| 钟祥市| 铁岭县| 健康| 上高县| 沐川县| 靖江市| 长垣县| 长春市| 溧阳市| 晋州市| 资源县| 高台县| 防城港市| 水城县| 登封市| 友谊县| 讷河市| 环江| 平南县| 禄劝| 集贤县| 大英县| 浏阳市| 岳普湖县| 彝良县| 达州市| 环江| 集安市| 花莲市| 交口县| 太和县| 青田县| 屏边| 巴林左旗| 浦江县| 泗阳县| 龙州县| 农安县| 洛扎县|