原文鏈接:Getting Started with Java-JSON Serialization & Deserialization
翻譯:簽到錢就到
在發布了50多篇Retrofit的文章之后,收到很多讀者的反饋,要求我們對Google的Gson做一個擴展介紹。Gson是一個將JSON格式的數據結構映射成java對象的非常強大的庫。當然,它也支持其他組織的方式,并且也能為你的java對象創建合適的JSON表示形式。
如果你對我們正在進行的這個系列感興趣,請瀏覽一下下面的大綱。
Gson系列概覽
- Gson——用java-JSON實現序列化和反序列化
- Mapping of Nested Objects
- Mapping of Arrays and Lists of Objects
- Mapping of Maps
- Mapping of Sets
- Mapping of Null Values
- Gson Model Annotations — How to Ignore Fields with @Expose
- Gson Model Annotations — How to Change the Naming of Fields with @SerializedName
- Gson Builder — Basics & Naming Policies
- Gson Builder — Force Serialization of null Values
- Gson Builder — Exclusion Strategies
- Gson Builder — Relax Gson with Lenient
- Gson Builder — Special Values of Floats & Doubles
- Gson Builder — Model Versioning
- Gson Builder — Formatting of Dates & Custom Date/Time Mapping
- Gson Builder — Pretty Printing
- Gson Builder — HTML Escaping
Gson 依賴
本指南將要著手,首先在一分鐘內完成一些序列化的準備工作。
由于大多數讀者都是Android開發者,我們會為你量身定制,但是Gson也能被用在任何Java環境中。在我們開始之前,我們需要將Gson庫拖到我們的項目工程中。截止到寫作時間,最新的版本是2.6.2
。如果你正在使用Gradle,添加下面的代碼:
compile 'com.google.code.gson:gson:2.6.2'
如果你正在使用Maven,你可以添加下面的依賴:
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
對于那些都沒有使用依賴環境系統的可憐家伙,你可以從官方的Github倉庫里下載jar包。
Java-JSON序列化基礎
讓我們做一些系列化!在Gson中序列化是指映射一個java對象到它的JSON表達。在后續的教程中,我們的數據將會變得更復雜,但是我們現在只要從一些非常簡單的UserSimple
開始:
public class UserSimple {
String name;
String email;
int age;
boolean isDeveloper;
}
user對象有四個屬性:
- user的
name
是一個 String 對象 - user的
email
是一個 String 對象 - user的
age
是一個 integer, 表明是按年來表示的(例如26
,并非準確的生日!) - 一個 boolean 標簽
isDeveloper
我們的Android或java應用需要轉換一個UserSimple對象到它的JSON表示。假設我們保持成員變量名字一致,我們會為Norman(這篇文章的作者)準備這樣的JSON表示:
{
"name": "Norman",
"email": "norman@futurestud.io",
"age": 26,
"isDeveloper": true
}
讓我們研究怎么用Gson完成轉換。首先,我們需要為Norman創建一個Java對象。
UserSimple userObject = new UserSimple(
"Norman",
"norman@futurestud.io",
26,
true
);
譯者注:如果沒有在UserSimple類里添加對應的構造函數,上面會報錯。添加也很簡單,UserSimple類內部編輯界面,右鍵—>Generate->Constructor->全部選中 ,點擊ok。自動生成如下代碼:
public UserSimple(String name, String email, int age, boolean isDeveloper) {
this.name = name;
this.email = email;
this.age = age;
this.isDeveloper = isDeveloper;
}
為了完成序列化,我們需要一個Gson
對象來操作轉換。我們可以簡單的使用下面的創建:
Gson gson = new Gson();
為了開始序列化,我們需要調用toJson()
方法,然后傳遞UserSimple
對象:
String userJson = gson.toJson(userObject);
userJson
對象包含了下面的值:
{
"age": 26,
"email": "norman@futurestud.io",
"isDeveloper": true,
"name": "Norman"
}
Gson改變了屬性的順序(按字母順序),但是內容是一樣的!注意Gson是如何表示這些類型的。String值用“”
包裹,但integer值卻沒有包裹。我們不需要在JSON對象或復制單個成員上浪費時間。一個Gson的簡單調用足以映射整個對象。當我們處理非常復雜的數據結構時,這是非常方便的。但在我們進一步深入之前,我們測試另一個方向。Gson可以從上面的JSON數據中創建一個java對象么?
java-JSON 反序列化基礎
首先,我們需要創建一個字符串,包含上面提到的JSON:
String userJson = "{'age':26,'email':'norman@futurestud.io','isDeveloper':true,'name':'Norman'}";
我們將 "
變為 '
,是為了避免大量的\"
轉義。它就是這樣工作的。下一步,可能你已經猜到了,創建一個Gson實例:
Gson gson = new Gson();
最后,我們必須用fromJson()
映射一個JSON到一個Java對象:
UserSimple userObject = gson.fromJson(userJson, UserSimple.class);
注意我們是怎樣將Java對象作為第二個參數進行傳遞。否則Gson不知道應該將JSON映射。它不是一個魔術師!
如果我們添加了一個debugger并且檢查了user對象的結果,它會展示Gson成功地準確映射了所有屬性:

計劃 與 展望
看完這篇引導文章后,你應該已經了解了Gson的基本使用。我們已經展示了如何簡單地完成JSON數據與Java的映射。我們也知道你此刻肯定有大量的問題要問:
- Java模型類需要一個constructor/getter/setter么?
- Java模型字段可以是私有(private)的么?
- 怎樣處理空值(null values)?
- 對于JSON數據,如果Java類有不同的變量命名怎么辦?
- 如何序列化(反序列化)對象數組/列表?
- 如何序列化(反序列化)嵌套對象?
- 當執行
.fromJson()
時,JSON數據中獲取不到某個屬性的值,Gson會為其保留一個默認的值么?
沒必要擔心,我們會在后續的文章中一一解答。如果你有特別的主題,在下面的評論中或twitter@futurestud_io讓我們知道。