Gson——用java-JSON實現(xiàn)序列化和反序列化

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

作者:Norman Peitek

翻譯:簽到錢就到

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

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

Gson系列概覽

  1. Gson——用java-JSON實現(xiàn)序列化和反序列化
  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 依賴

本指南將要著手,首先在一分鐘內完成一些序列化的準備工作晨雳。
由于大多數(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讓我們知道。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末颁湖,一起剝皮案震驚了整個濱河市宣蠕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爷狈,老刑警劉巖植影,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裳擎,死亡現(xiàn)場離奇詭異涎永,居然都是意外死亡,警方通過查閱死者的電腦和手機鹿响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門羡微,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惶我,你說我怎么就攤上這事妈倔。” “怎么了绸贡?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵盯蝴,是天一觀的道長。 經常有香客問我听怕,道長捧挺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任尿瞭,我火速辦了婚禮闽烙,結果婚禮上,老公的妹妹穿的比我還像新娘声搁。我一直安慰自己黑竞,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布疏旨。 她就那樣靜靜地躺著很魂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪檐涝。 梳的紋絲不亂的頭發(fā)上遏匆,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天霞玄,我揣著相機與錄音,去河邊找鬼拉岁。 笑死坷剧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的喊暖。 我是一名探鬼主播惫企,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陵叽!你這毒婦竟也來了狞尔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤巩掺,失蹤者是張志新(化名)和其女友劉穎偏序,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胖替,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡研儒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了独令。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片端朵。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖燃箭,靈堂內的尸體忽然破棺而出冲呢,到底是詐尸還是另有隱情,我是刑警寧澤招狸,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布敬拓,位于F島的核電站,受9級特大地震影響裙戏,放射性物質發(fā)生泄漏乘凸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一挽懦、第九天 我趴在偏房一處隱蔽的房頂上張望翰意。 院中可真熱鬧,春花似錦信柿、人聲如沸冀偶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽进鸠。三九已至,卻和暖如春形病,著一層夾襖步出監(jiān)牢的瞬間客年,已是汗流浹背霞幅。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留量瓜,地道東北人司恳。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像绍傲,于是被迫代替她去往敵國和親扔傅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容