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
史上最全的HTML和CSS標籤常用命名規則
資料夾主要建立以下資料夾: 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)缺點 生成的可執行程式大;靜態庫改變了,就
最全的HTML和CSS標籤命名規則
資料夾命名 主要建立以下資料夾: 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.(作用的介紹),方便識別軟體、類