之前翻譯了Gson User Guide,覺得很多用法還不是很清楚,特翻譯Gson Tutorial Series這一系列不錯的教程。這里是該系列的首篇。
Gson依賴
該指南是實踐性的并會立刻實現一些序列化。因為大部分的讀者來自Android開發者,因此這是專門為你們定制的,但是Gson可以用于任何的Java環境。在我們開始之前,我們得將Gson庫引進項目。在我寫該文檔時,最新版本為2.8.2。如果你使用的是Gradle,請添加下行代碼:
compile 'com.google.code.gson:gson:2.8.2'
如果你使用的是Maven,你可以添加下面的依賴:
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
對于其他開發者,你可以在其官方Github倉庫下載相應的jar包。
基本的Java-JSON序列化
讓我們做一些序列化工作吧!Serialization在Gson中的意思是將一個Java對象映射為相應的JSON表達方式。在稍后的教程中,我們會采用稍微復雜一點的數據,但是現在,我們以一個相當簡單的UserSimplement對象開始:
public class UserSimple {
String name;
String email;
int age;
boolean isDeveloper;
}
這個user對象有四個屬性:
- user的name是一個字符串類型
- user的email也是一個字符串類型
- user的age是一個整型,意味著年齡存儲的是年數(比如26歲,而不是準確的生日日期!)
- 最后的布爾類型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
);
完成序列化,需要一個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值被""包裹,而整型值不被包裹。我們不必為JSON的諸多對象或者復制單個成員而煩惱。Gson通過一個調用足以映射整個對象。這對于我們處理復雜的數據結構會是相當有幫助的。在我們繼續深入之前,我們得轉向另一個方向。Gson是否能夠基于JSON創建一個Java對象?
基本的JSON-Java反序列化
首先,我們需要穿件一個字符串,該字符串包含上面提到的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不知道它該映射到哪里。它并不是一個魔術師!
如果我們使用debugger并查看userObject的結果,我們發現Gson成功的映射了所有的屬性: