Gson——用java-JSON實現序列化和反序列化

原文鏈接:Getting Started with Java-JSON Serialization & Deserialization

作者:Norman Peitek

翻譯:簽到錢就到

在發布了50多篇Retrofit的文章之后,收到很多讀者的反饋,要求我們對Google的Gson做一個擴展介紹。Gson是一個將JSON格式的數據結構映射成java對象的非常強大的庫。當然,它也支持其他組織的方式,并且也能為你的java對象創建合適的JSON表示形式。

如果你對我們正在進行的這個系列感興趣,請瀏覽一下下面的大綱。

Gson系列概覽

  1. Gson——用java-JSON實現序列化和反序列化
  2. Mapping of Nested Objects
  3. Mapping of Arrays and Lists of Objects
  4. Mapping of Maps
  5. Mapping of Sets
  6. Mapping of Null Values
  7. Gson Model Annotations — How to Ignore Fields with @Expose
  8. Gson Model Annotations — How to Change the Naming of Fields with @SerializedName
  9. Gson Builder — Basics & Naming Policies
  10. Gson Builder — Force Serialization of null Values
  11. Gson Builder — Exclusion Strategies
  12. Gson Builder — Relax Gson with Lenient
  13. Gson Builder — Special Values of Floats & Doubles
  14. Gson Builder — Model Versioning
  15. Gson Builder — Formatting of Dates & Custom Date/Time Mapping
  16. Gson Builder — Pretty Printing
  17. 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讓我們知道。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容