1. 程式人生 > >Gson Builder — 基礎和命名規則

Gson Builder — 基礎和命名規則

在之前文章中,我們學習了使用 Gson 序列化和反序列化 Java 物件,到目前為止,我們總結了對映的過程。這篇文章開始我們將開始一個新的系列 GsonBuider,GsonBuider 用來自定義Gson。

 GsonBuider 基礎

在之前的文章中,我們經常使用這樣來生成一個 Gson 物件,Gson gson = new Gson();  這是標準的Gson生成方式,不過 Gson 提供了擴充套件,如果你有一些特殊的需求,你可以使用 GsonBuider 來自定義 Gson。

// previously
Gson gson = new Gson();

// now using GsonBuilder
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();

使用 GsonBuilder.create() 方法就可以建立一個 Gson 例項,有了它就可以解析各種資料型別了。

命名規則

首先要介紹下 GsonBuilder 中命名規則,我們一直認為 Java model 中欄位名和 JSON 中欄位名應該保持一致,但是我們可以通過 @SerializedName 來幫我們解決這種欄位不一致的問題。

使用 @SerializedName 解決是一種方式,但是 Gson 也提供了一種自定義方式,使用 FieldNamingPolicy,我們根據例子來說明。

public class UserNaming {
   String Name;
   String email_of_developer;
   boolean isDeveloper;
   int _ageOfDeveloper;
}

可以看到,我們給不同型別的變數命名了不同的規則的欄位名,這樣做主要是為了之後自定義設定。

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

先不用理解 FieldNamingPolicy.IDENTITY,這段程式碼的意思是,我們的 Gson 使用了 FieldNamingPolicy.IDENTITY 的自定義設定,接下來的幾個例子我們將介紹 FieldNamingPolicy 中的其他屬性。

 FieldNamingPolicy.IDENTITY

FieldNamingPolicy.IDENTITY 的作用是,完全匹配我們 Java model 中的欄位名,不管你有沒有設定其他註解屬性,我們使用以下程式碼來生成一段 JSON 資料:

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

UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
String usersJson = gson.toJson(user);

輸出:

{
    "Name": "Norman",
    "_ageOfDeveloper": 26,
    "email_of_developer": "[email protected]",
    "isDeveloper": true
}

可以看到欄位名就是我們 model 中的欄位名,沒有發生改變,如果你使用預設生成例項或者不使用 GsonBuilder 自定義生成,最後都會得到相同的結果。

FieldNamingPolicy - LOWER_CASE_WITH_UNDERSCORES

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

UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);

String usersJson = gson.toJson(user);

使用 FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES 規則,將修改生成的 JSON 中的欄位名,格式將全部變成小寫,並且每個單詞用“_” 分割,輸出如下:

{
    "name": "Norman",
    "_age_of_developer": 26,
    "email_of_developer": "[email protected]",
    "is_developer": true
}

這個很容易理解,我們可以通過看原始碼來發現:

LOWER_CASE_WITH_UNDERSCORES() {  
      public String translateName(Field f) {  
             return separateCamelCase(f.getName(), "_").toLowerCase();  
      }
}

 ## FieldNamingPolicy - LOWER_CASE_WITH_DASHES

有了上面的理解,這個就很好理解了,除了每個單詞用“-” 分隔意外其他和
FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES 都一樣

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

UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
String usersJson = gson.toJson(user);

輸出:

{
    "name": "Norman",
    "_age-of-developer": 26,
    "email_of_developer": "[email protected]",
    "is-developer": true
}

FieldNamingPolicy - UPPER_CAMEL_CASE

這個就更簡單了,規則是每個單詞的第一個字母都要大寫,其他不變

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

UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
String usersJson = gson.toJson(user);

輸出

 {
    "Name": "Norman",
    "_AgeOfDeveloper": 26,
    "Email_of_developer": "[email protected]",
     "IsDeveloper": true
}

看結果就可以發現,採用了駝峰命名規則,_AgeOfDeveloper 看起來比較特殊,但它是正確的命名方法。

FieldNamingPolicy - UPPER_CAMEL_CASE_WITH_SPACES

規則如下:

1、每個單詞的第一個字母會大寫
2、每個單詞使用空格分隔

含有 “_” 的連結的不會在使用空格。

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

UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
String usersJson = gson.toJson(user);

輸出:

{
    "Name": "Norman",
    "_Age Of Developer": 26,
    "Email_of_developer": "[email protected]",
    "Is Developer": true
}

@SerializedName 混用

關於 @SerializedName 的用法,我們在之前的文章中已經介紹過了

public class UserNaming {
    String Name;

    @SerializedName("emailOfDeveloper")
    String email_of_developer;

    boolean isDeveloper;
    int _ageOfDeveloper;
}

看上面的例子,我們使用了 @SerializedName ,如果我們在使用 UPPER_CAMEL_CASE 規則,將會發生什麼?

執行看下結果:

{
    "Name": "Norman",
    "_AgeOfDeveloper": 26,
    "emailOfDeveloper": "[email protected]",
    "IsDeveloper": true
}

你會發現出了 emailOfDeveloper 其他的欄位每個單詞的首字母都大寫了,說明最後以 @SerializedName 為準。

自定義規則

@SerializedName 可能不能滿足你的需求規則,我們將使用 GsonBuilder的 setFieldNamingStrategy 方法 ,FieldNamingStrategy 自定義規則。例如:

FieldNamingStrategy customPolicy = new FieldNamingStrategy() {
    @Override
        public String translateName(Field f) {
            return f.getName().replace("_", "");
      }
};

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingStrategy(customPolicy);
Gson gson = gsonBuilder.create();

UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
String usersJson = gson.toJson(user);

輸出:

{
    "Name": "Norman",
    "ageOfDeveloper": 26,
    "emailOfDeveloper": "[email protected]",
    "isDeveloper": true
}

上面將會把 “_” 剔除,需要注意的是一次只能有一個規則,如果使用多個規則,將以最後一個為準。

反序列化

以上都是關於序列化的操作,統一以上的規則也使用於 JSON 的反序列化操作,如果你的伺服器返回的 JSON 欄位是以小寫和下劃線作為規則的話,就可以使用 LOWER_CASE_WITH_UNDERSCORES
規則來匹配欄位名稱。

例如:

{
    "reviewer_name": "Marcus"
}

可以這樣定義 Java model 類:

public class PostReviewer {
      String reviewerName;//不用分隔線,採用駝峰命名
}

目標

瞭解 GsonBuilder 的基本使用,根據不同需求進行自定義 GsonBuilder 規則。

下一篇將繼續介紹有關 GsonBuilder 的操作。

Gson 系列文章翻譯回顧

相關推薦

Gson Builder基礎命名規則

在之前文章中,我們學習了使用 Gson 序列化和反序列化 Java 物件,到目前為止,我們總結了對映的過程。這篇文章開始我們將開始一個新的系列 GsonBuider,GsonBuider 用來自定義Gson。  GsonBuider 基礎 在之前的文

javaScript中的數據類型命名規則

mbo ble 連接 ron define not nan 註意 實的 有7種數據類型: undefined(未定義) null(空), boolean(布爾型) string(字符串) symbol(符號), number(數字) object(對象) 命名規則 Var

Java程式的組織形式命名規則

Java程式的組織形式: Java程式是一個純粹的面向物件的語言,因此Java程式必須以類(class)的形式存在。 類(class)是Java程式中的最小程式單位,Java程式不允許可執行語句,方法等成分獨立存在,所有的程式部分都必須存放在類定義裡。 Java原始檔的命

FPGA 主流晶片選型指導命名規則(一)

題目可能有點大,主要介紹Xilinx和Altera公司的主流晶片的選型(包括中低高階產品的介紹)和兩大廠家的命名規則,主要看封裝和邏輯數量。 1.主流晶片選型 1.1Xilinx主流晶片選型   老規矩,先上個文件,可以自行下載:   http://

C++考試複習(2):c++識別符號命名規則

字符集 C++的字符集有下面的字符集組成: (1)52個大小寫英文字母; (2)10個數字字元 (3)其他字元: 空格 ! # % ……& * _等等 識別符號 含義: 由若干個字元構成的具

python基礎之識別符號、關鍵字、變數的命名規則、變數的輸入輸出

一、識別符號和關鍵字 1、標示符就是程式設計師定義的變數名、函式名 *注意:識別符號可以由字母、下劃線、和數字組成;不能以數字開頭;不能與關鍵字重名。 2、關鍵字就是在 Python 內部已經使用的識別符號;具有特殊的功能和含義; 開發者 不允許定義和關鍵字相同的名字的標示符。 二、變數的命

java基礎:標識符組成規則

規則 字母 方法 java基礎 font clas 本質 java class 標識符的概念: 就是給類,接口,方法,變量等起名字的字符序列 標識符的組成規則: A:英文大小寫字母 B:數字 C:$和_ 註意事項: A:不能以數字開頭 B:不能是java中的關鍵字 C

xilinx的FPGA命名規則一些簡寫含義

如果 com bsp -1 具體實現 customer instead qml 來看 xilinx公司的FPGA種類繁多,知道了命名規則,看起來應該會舒服很多。 1.xilinx的FPGA命名規則Xilinx的ug112第一章中介紹了Xilinx公司的FPGA命名規則。一般

51單片機STM32單片機的基本命名規則

-m img tex .com ice 目前 集成 閃存 cor 51內核的單片機命名規則,以STC12 5A 60 S2為例 STM32代表ST品牌Cortex-Mx系列內核(ARM)的32位MCU;命名規則如下: STM32 F 103 C 6 T 7 x

FreeRTOS變數函式命名規則

1、變數名         在 FreeRTOS 中,定義變數的時候往往會把變數的型別當作字首加在變數上,這樣的 好處是讓使用者一看到這個變數就知道該變數的型別。 c :  char 型變數. s : sho

常量變數及其命名規則

常量:約定俗成,所有的字母大寫就是常量:OLDBOY,∏(PI)=3.141592653 print (∏) 變數: 把程式執行過程中產生的中間值暫時儲存起來,方便後面的程式呼叫, a = 18/3 # 建立變數a ,將18/3的結果賦值給a print(a) b = a-3 #3 print(

命名規則規範

java 命名規則 : 只能由26個字母大小寫, 數字0~9, _和$(不要使用) 數字不可以開頭 不能使用關鍵字和保留字, 但是可以包含關鍵字和保留字 大小寫敏感, 長度65535 不能包含空格 MyCla

史上最全的HTMLCSS標籤常用命名規則

資料夾主要建立以下資料夾:   1、Images 存放一些網站常用的圖片;   2、Css 存放一些CSS檔案;   3、Flash 存放一些Flash檔案;   4、PSD 存放一些PSD原始檔;   5、Temp 存放所有臨時圖片和其它檔案;   6、copyright

ubuntu版本的命名規則開發代號等科普

Ubuntu 版本的命名規則和開發代號等科普 Ubuntu 版本的命名規則和開發代號等科普 Ubuntu版本的命名規則是根據正式版釋出的年月命名,Ubuntu 8.10 也就意味著 2008年10月釋出的 Ubuntu,研發人員與使用者可從版本號碼就知道正式釋出

Linux靜態庫動態庫的命名規則編譯連結

1、Linux靜態庫和動態庫的命名規則 靜態函式庫 靜態庫的名字一般是libxxx.a,利用靜態庫編譯生成的檔案比較大,因為整個靜態庫所有的資料都會被整合進目的碼中。 a)優點 編譯後,可執行檔案不需要外部支援; b)缺點 生成的可執行程式大;靜態庫改變了,就

最全的HTMLCSS標籤命名規則

資料夾命名 主要建立以下資料夾: Images 存放一些網站常用的圖片; Css 存放一些CSS檔案; Flash 存放一些Flash檔案; PSD 存放一些PSD原始檔; Temp 存放所有臨時圖片和其它檔案; copyright 版權資訊(可選)

java基礎入門--java的命名規則

/* 組成規則: a:英文字母大小寫 b:數字字元 c:$和_ 注意事項: a:不能以數字開頭。 b:不能是java中的關鍵字

Java基礎筆記(四)——命名規則、數據類型

嚴格 符號 構造函數 不能 釋放 常量 存在 null 超過 標識符即Java程序中需要自定義的名稱,如變量名、方法名、類名、包名、工程名等。 標識符的命名規則: 1.可由字母、數字、下劃線(_)和美元符($)組成,不能以數字開頭。 2.嚴格區分大小寫。 3.不能是Java

iOS App圖示LaunchImage啟動頁尺寸及命名規則

2015/11/12 星期四 下午 1:39 注意:iOS所有圖示的圓角效果由系統生成,給到的圖示本身不能是圓角的 App icon for the App Store (requiredfor all apps)  1024 x 1024 1. 桌面圖示 (

【Java基礎】包、類、介面、常量、方法、變數的命名規則

1、包(package)命名規則: 使用公司域名倒寫作為包名,如公司域名 www.weibin.com ,則包名為com.weibin.www 或com.weibin.(作用的介紹),方便識別軟體、類