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

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

作者:Norman Peitek

翻譯:簽到錢就到

在發(fā)布了50多篇Retrofit的文章之后,收到很多讀者的反饋,要求我們對Google的Gson做一個擴展介紹。Gson是一個將JSON格式的數(shù)據(jù)結(jié)構(gòu)映射成java對象的非常強大的庫。當(dāng)然,它也支持其他組織的方式,并且也能為你的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 依賴

本指南將要著手,首先在一分鐘內(nèi)完成一些序列化的準備工作。
由于大多數(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序列化基礎(chǔ)

讓我們做一些系列化!在Gson中序列化是指映射一個java對象到它的JSON表達。在后續(xù)的教程中,我們的數(shù)據(jù)將會變得更復(fù)雜,但是我們現(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應(yīng)用需要轉(zhuǎn)換一個UserSimple對象到它的JSON表示。假設(shè)我們保持成員變量名字一致,我們會為Norman(這篇文章的作者)準備這樣的JSON表示:

{
  "name": "Norman",
  "email": "norman@futurestud.io",
  "age": 26,
  "isDeveloper": true
}

讓我們研究怎么用Gson完成轉(zhuǎn)換。首先,我們需要為Norman創(chuàng)建一個Java對象。

UserSimple userObject = new UserSimple(  
    "Norman", 
    "norman@futurestud.io", 
    26, 
    true
);

譯者注:如果沒有在UserSimple類里添加對應(yīng)的構(gòu)造函數(shù),上面會報錯。添加也很簡單,UserSimple類內(nèi)部編輯界面,右鍵—>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對象來操作轉(zhuǎn)換。我們可以簡單的使用下面的創(chuàng)建:

Gson gson = new Gson(); 

為了開始序列化,我們需要調(diào)用toJson()方法,然后傳遞UserSimple對象:

String userJson = gson.toJson(userObject);  

userJson對象包含了下面的值:

{
  "age": 26,
  "email": "norman@futurestud.io",
  "isDeveloper": true,
  "name": "Norman"
}

Gson改變了屬性的順序(按字母順序),但是內(nèi)容是一樣的!注意Gson是如何表示這些類型的。String值用“”包裹,但integer值卻沒有包裹。我們不需要在JSON對象或復(fù)制單個成員上浪費時間。一個Gson的簡單調(diào)用足以映射整個對象。當(dāng)我們處理非常復(fù)雜的數(shù)據(jù)結(jié)構(gòu)時,這是非常方便的。但在我們進一步深入之前,我們測試另一個方向。Gson可以從上面的JSON數(shù)據(jù)中創(chuàng)建一個java對象么?

java-JSON 反序列化基礎(chǔ)

首先,我們需要創(chuàng)建一個字符串,包含上面提到的JSON:

String userJson = "{'age':26,'email':'norman@futurestud.io','isDeveloper':true,'name':'Norman'}";  

我們將 "變?yōu)?' ,是為了避免大量的\"轉(zhuǎn)義。它就是這樣工作的。下一步,可能你已經(jīng)猜到了,創(chuàng)建一個Gson實例:

Gson gson = new Gson(); 

最后,我們必須用fromJson()映射一個JSON到一個Java對象:

UserSimple userObject = gson.fromJson(userJson, UserSimple.class);   

注意我們是怎樣將Java對象作為第二個參數(shù)進行傳遞。否則Gson不知道應(yīng)該將JSON映射。它不是一個魔術(shù)師!

如果我們添加了一個debugger并且檢查了user對象的結(jié)果,它會展示Gson成功地準確映射了所有屬性:

計劃 與 展望

看完這篇引導(dǎo)文章后,你應(yīng)該已經(jīng)了解了Gson的基本使用。我們已經(jīng)展示了如何簡單地完成JSON數(shù)據(jù)與Java的映射。我們也知道你此刻肯定有大量的問題要問:

  • Java模型類需要一個constructor/getter/setter么?
  • Java模型字段可以是私有(private)的么?
  • 怎樣處理空值(null values)?
  • 對于JSON數(shù)據(jù),如果Java類有不同的變量命名怎么辦?
  • 如何序列化(反序列化)對象數(shù)組/列表?
  • 如何序列化(反序列化)嵌套對象?
  • 當(dāng)執(zhí)行.fromJson()時,JSON數(shù)據(jù)中獲取不到某個屬性的值,Gson會為其保留一個默認的值么?

沒必要擔(dān)心,我們會在后續(xù)的文章中一一解答。如果你有特別的主題,在下面的評論中或twitter@futurestud_io讓我們知道。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容