原文鏈接:Getting Started with Java-JSON Serialization & Deserialization
翻譯:簽到錢就到
在發(fā)布了50多篇Retrofit的文章之后丽猬,收到很多讀者的反饋中狂,要求我們對Google的Gson做一個擴展介紹允睹。Gson是一個將JSON格式的數(shù)據(jù)結構映射成java對象的非常強大的庫。當然吭狡,它也支持其他組織的方式,并且也能為你的java對象創(chuàng)建合適的JSON表示形式。
如果你對我們正在進行的這個系列感興趣,請瀏覽一下下面的大綱慷暂。
Gson系列概覽
- Gson——用java-JSON實現(xiàn)序列化和反序列化
- 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 依賴
本指南將要著手,首先在一分鐘內完成一些序列化的準備工作晨雳。
由于大多數(shù)讀者都是Android開發(fā)者行瑞,我們會為你量身定制,但是Gson也能被用在任何Java環(huán)境中餐禁。在我們開始之前血久,我們需要將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>
對于那些都沒有使用依賴環(huán)境系統(tǒng)的可憐家伙筑舅,你可以從官方的Github倉庫里下載jar包。
Java-JSON序列化基礎
讓我們做一些系列化陨舱!在Gson中序列化是指映射一個java對象到它的JSON表達翠拣。在后續(xù)的教程中,我們的數(shù)據(jù)將會變得更復雜游盲,但是我們現(xiàn)在只要從一些非常簡單的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創(chuàng)建一個Java對象链峭。
UserSimple userObject = new UserSimple(
"Norman",
"norman@futurestud.io",
26,
true
);
譯者注:如果沒有在UserSimple類里添加對應的構造函數(shù)畦娄,上面會報錯。添加也很簡單,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
對象來操作轉換驳癌。我們可以簡單的使用下面的創(chuàng)建:
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的簡單調用足以映射整個對象衣摩。當我們處理非常復雜的數(shù)據(jù)結構時昂验,這是非常方便的。但在我們進一步深入之前艾扮,我們測試另一個方向既琴。Gson可以從上面的JSON數(shù)據(jù)中創(chuàng)建一個java對象么?
java-JSON 反序列化基礎
首先泡嘴,我們需要創(chuàng)建一個字符串甫恩,包含上面提到的JSON:
String userJson = "{'age':26,'email':'norman@futurestud.io','isDeveloper':true,'name':'Norman'}";
我們將 "
變?yōu)?'
,是為了避免大量的\"
轉義磕诊。它就是這樣工作的填物。下一步,可能你已經猜到了霎终,創(chuàng)建一個Gson實例:
Gson gson = new Gson();
最后滞磺,我們必須用fromJson()
映射一個JSON到一個Java對象:
UserSimple userObject = gson.fromJson(userJson, UserSimple.class);
注意我們是怎樣將Java對象作為第二個參數(shù)進行傳遞。否則Gson不知道應該將JSON映射莱褒。它不是一個魔術師!
如果我們添加了一個debugger并且檢查了user對象的結果击困,它會展示Gson成功地準確映射了所有屬性:
計劃 與 展望
看完這篇引導文章后,你應該已經了解了Gson的基本使用广凸。我們已經展示了如何簡單地完成JSON數(shù)據(jù)與Java的映射阅茶。我們也知道你此刻肯定有大量的問題要問:
- Java模型類需要一個constructor/getter/setter么?
- Java模型字段可以是私有(private)的么谅海?
- 怎樣處理空值(null values)脸哀?
- 對于JSON數(shù)據(jù),如果Java類有不同的變量命名怎么辦扭吁?
- 如何序列化(反序列化)對象數(shù)組/列表撞蜂?
- 如何序列化(反序列化)嵌套對象盲镶?
- 當執(zhí)行
.fromJson()
時,JSON數(shù)據(jù)中獲取不到某個屬性的值蝌诡,Gson會為其保留一個默認的值么溉贿?
沒必要擔心,我們會在后續(xù)的文章中一一解答浦旱。如果你有特別的主題宇色,在下面的評論中或twitter@futurestud_io讓我們知道。