- Gson 教程
- Gson - 首頁
- Gson - 概述
- Gson - 環境搭建
- Gson - 第一個應用
- Gson - 類
- Gson - 物件序列化
- Gson - 資料繫結
- Gson - 物件資料繫結
- Gson - 樹模型
- Gson - 流處理
- Gson - 序列化示例
- Gson - 序列化內部類
- Gson - 自定義型別介面卡
- Gson - 空物件支援
- Gson - 版本支援
- 從序列化中排除欄位
- Gson 有用資源
- Gson - 快速指南
- Gson - 有用資源
- Gson - 討論
Gson - 快速指南
Gson - 概述
Google Gson 是一個簡單的基於 Java 的庫,用於將 Java 物件序列化為 JSON,反之亦然。它是由 Google 開發的開源庫。
以下幾點突出了您應該使用此庫的原因:
標準化 - Gson 是一個由 Google 管理的標準化庫。
高效 - 它是 Java 標準庫的可靠、快速且高效的擴充套件。
最佳化 - 該庫已高度最佳化。
支援泛型 - 它為泛型提供了廣泛的支援。
支援複雜的內部類 - 它支援具有深度繼承層次結構的複雜物件。
Gson 的特性
以下是 Gson 的一些最突出的特性的列表:
易於使用 - Gson API 提供了一個高階外觀,以簡化常用用例。
無需建立對映 - Gson API 為大多數要序列化的物件提供了預設對映。
效能 - Gson 非常快,並且記憶體佔用率低。它適用於大型物件圖或系統。
簡潔的 JSON - Gson 建立一個簡潔且緊湊的 JSON 結果,易於閱讀。
無依賴性 - Gson 庫除了 JDK 之外不需要任何其他庫。
開源 - Gson 庫是開源的;它是免費提供的。
處理 JSON 的三種方式
Gson 提供了三種處理 JSON 的替代方法:
流式 API
它將 JSON 內容讀寫為離散事件。JsonReader 和 JsonWriter 將資料讀/寫為標記,稱為 JsonToken。
它是三種處理 JSON 方法中最強大的方法。它具有最低的開銷,並且在讀/寫操作中非常快。它類似於 XML 的 Stax 解析器。
樹模型
它準備 JSON 文件的記憶體中樹表示。它構建了一個 JsonObject 節點的樹。這是一種靈活的方法,類似於 XML 的 DOM 解析器。
資料繫結
它使用屬性訪問器將 JSON 轉換為 POJO(普通舊 Java 物件),反之亦然。Gson 使用資料型別介面卡讀取/寫入 JSON。它類似於 XML 的 JAXB 解析器。
Gson - 環境搭建
本地環境搭建
如果您仍然希望為 Java 程式語言設定本地環境,那麼本節將指導您如何在機器上下載和設定 Java。請按照以下步驟設定環境。
Java SE 可從以下連結免費獲取 下載 Java。因此,您可以根據您的作業系統下載一個版本。
按照說明下載 Java 並執行 .exe 檔案以在您的機器上安裝 Java。在您的機器上安裝 Java 後,您需要設定環境變數以指向其正確的安裝目錄。
在 Windows 2000/XP 中設定路徑
假設您已將 Java 安裝在 c:\Program Files\java\jdk 目錄中:
右鍵單擊“我的電腦”,然後選擇“屬性”。
在“高階”選項卡下單擊“環境變數”按鈕。
接下來,更改“Path”變數,使其還包含 Java 可執行檔案的路徑。例如,如果路徑當前設定為“C:\WINDOWS\SYSTEM32”,則將路徑更改為“C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin”。
在 Windows 95 / 98 / ME 中設定路徑
假設您已將 Java 安裝在 c:\Program Files\java\jdk 目錄中:
編輯“C:\autoexec.bat”檔案,並在末尾新增以下行:“SET PATH=%PATH%;C:\Program Files\java\jdk\bin”
為 Linux、UNIX、Solaris、FreeBSD 設定路徑
環境變數 PATH 應設定為指向 Java 二進位制檔案安裝的位置。如果您在執行此操作時遇到問題,請參閱您的 shell 文件。
例如,如果您使用 bash 作為您的 shell,則您將在“.bashrc”的末尾新增以下行:export PATH=/path/to/java:$PATH
流行的 Java 編輯器
要編寫您的 Java 程式,您將需要一個文字編輯器。市場上有很多複雜的 IDE 可用。但就目前而言,您可以考慮以下之一:
記事本 - 在 Windows 上,您可以使用任何簡單的文字編輯器,如記事本(推薦用於本教程)或 TextPad。
Netbeans - 它是一個開源且免費的 Java IDE,可以從 https://netbeans.org/index.html 下載。
Eclipse - 它也是一個由 Eclipse 開源社群開發的 Java IDE,可以從 https://www.eclipse.org/ 下載。
下載 Gson 歸檔檔案
從 gson-2.3.1.jar 下載 Gson jar 檔案的最新版本。在編寫本教程時,我們下載了 gson-2.3.1.jar 並將其複製到 C:\>gson 資料夾中。
| 作業系統 | 歸檔檔名 |
|---|---|
| Windows | gson-2.3.1.jar |
| Linux | gson-2.3.1.jar |
| Mac | gson-2.3.1.jar |
設定 Gson 環境
設定 GSON_HOME 環境變數以指向 Gson jar 儲存在您機器上的基本目錄位置。
| 作業系統 | 輸出 |
|---|---|
| Windows | 將環境變數 GSON_HOME 設定為 C:\gson |
| Linux | export GSON_HOME=/usr/local/gson |
| Mac | export GSON_HOME=/Library/gson |
設定 CLASSPATH 變數
設定 CLASSPATH 環境變數以指向 Gson jar 的位置。
| 作業系統 | 輸出 |
|---|---|
| Windows | 將環境變數 CLASSPATH 設定為 %CLASSPATH%;%GSON_HOME%\gson-2.3.1.jar;.; |
| Linux | export CLASSPATH=$CLASSPATH:$GSON_HOME/gson-2.3.1.jar:. |
| Mac | export CLASSPATH=$CLASSPATH:$GSON_HOME/gson-2.3.1.jar:. |
Gson - 第一個應用
在深入瞭解 Google Gson 庫的細節之前,讓我們先看看一個正在執行的應用程式。在此示例中,我們建立了一個 Student 類。我們將建立一個包含學生詳細資訊的 JSON 字串,並將其反序列化為 student 物件,然後將其序列化為 JSON 字串。
示例
在 C:\>GSON_WORKSPACE 中建立一個名為 GsonTester 的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonTester {
public static void main(String[] args) {
String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
class Student {
private String name;
private int age;
public Student(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student [ name: "+name+", age: "+ age+ " ]";
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行 GsonTester 以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
Student [ name: Mahesh, age: 21 ]
{
"name" : "Mahesh",
"age" : 21
}
需要記住的步驟
以下是此處需要考慮的重要步驟。
步驟 1 - 使用 GsonBuilder 建立 Gson 物件
建立一個 Gson 物件。它是一個可重用的物件。
GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); Gson gson = builder.create();
步驟 2 - 將 JSON 反序列化為物件
使用 fromJson() 方法從 JSON 獲取物件。將 Json 字串/Json 字串源和物件型別作為引數傳遞。
//Object to JSON Conversion Student student = gson.fromJson(jsonString, Student.class);
步驟 3 - 將物件序列化為 JSON
使用 toJson() 方法獲取物件的 JSON 字串表示形式。
//Object to JSON Conversion jsonString = gson.toJson(student);
Gson - 類
Gson 是 Google Gson 庫的主要參與者類。它提供了將 Java 物件轉換為匹配的 JSON 結構以及反之的功能。Gson 最初是使用 GsonBuilder 構造的,然後使用 toJson(Object) 或 fromJson(String, Class) 方法來讀取/寫入 JSON 結構。
類宣告
以下是 com.google.gson.Gson 類的宣告:
public final class Gson extends Object
建構函式
| 序號 | 建構函式和描述 |
|---|---|
| 1 |
Gson() 使用預設配置構造 Gson 物件。 |
類方法
| 序號 | 方法和描述 |
|---|---|
| 1 |
<T> T fromJson(JsonElement json, Class<T> classOfT) 此方法將從指定的解析樹中讀取的 Json 反序列化為指定型別的物件。 |
| 2 |
<T> T fromJson(JsonElement json, Type typeOfT) 此方法將從指定的解析樹中讀取的 Json 反序列化為指定型別的物件。 |
| 3 |
<T> T fromJson(JsonReader reader, Type typeOfT) 從 reader 讀取下一個 JSON 值並將其轉換為 typeOfT 型別的物件。 |
| 4 |
<T> T fromJson(Reader json, Class<T> classOfT) 此方法將從指定的 reader 讀取的 Json 反序列化為指定類的物件。 |
| 5 |
<T> T fromJson(Reader json, Type typeOfT) 此方法將從指定的 reader 讀取的 Json 反序列化為指定型別的物件。 |
| 6 |
<T> T fromJson(String json, Class<T> classOfT) 此方法將指定的 Json 反序列化為指定類的物件。 |
| 7 |
<T> T fromJson(String json, Type typeOfT) 此方法將指定的 Json 反序列化為指定型別的物件。 |
| 8 |
<T> TypeAdapter<T> getAdapter(Class<T> type) 返回 type 的型別介面卡。 |
| 9 |
<T> TypeAdapter<T> getAdapter(TypeToken<T> type) 返回 type 的型別介面卡。 |
| 10 |
<T> TypeAdapter<T> getDelegateAdapter(TypeAdapterFactory skipPast, TypeToken<T> type) 此方法用於獲取指定型別的備用型別介面卡。 |
| 11 |
String toJson(JsonElement jsonElement) 將 JsonElements 的樹轉換為其等效的 JSON 表示形式。 |
| 12 |
void toJson(JsonElement jsonElement, Appendable writer) 寫出 JsonElements 樹的等效 JSON。 |
| 13 |
void toJson(JsonElement jsonElement, JsonWriter writer) 將 jsonElement 的 JSON 寫入 writer。 |
| 14 |
String toJson(Object src) 此方法將指定的 object 序列化為其等效的 Json 表示形式。 |
| 15 |
void toJson(Object src, Appendable writer) 此方法將指定的 object 序列化為其等效的 Json 表示形式。 |
| 16 |
String toJson(Object src, Type typeOfSrc) 此方法將指定的 object(包括泛型型別的 object)序列化為其等效的 Json 表示形式。 |
| 17 |
void toJson(Object src, Type typeOfSrc, Appendable writer) 此方法將指定的 object(包括泛型型別的 object)序列化為其等效的 Json 表示形式。 |
| 18 |
void toJson(Object src, Type typeOfSrc, JsonWriter writer) 將 typeOfSrc 型別的 src 的 JSON 表示形式寫入 writer。 |
| 19 |
JsonElement toJsonTree(Object src) 此方法將指定的 object 序列化為其等效的 JsonElements 樹表示形式。 |
| 20 |
JsonElement toJsonTree(Object src, Type typeOfSrc) 此方法將指定的 object(包括泛型型別的 object)序列化為其等效的 JsonElements 樹表示形式。 |
| 21 |
String toString() |
繼承的方法
此類繼承自以下類:
- java.lang.Object
示例
使用您選擇的任何編輯器建立以下 Java 程式,並將其儲存到例如 C:/> GSON_WORKSPACE
檔案 - GsonTester.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonTester {
public static void main(String[] args) {
String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
class Student {
private String name;
private int age;
public Student(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student [ name: "+name+", age: "+ age+ " ]";
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行 GsonTester 以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出
Student [ name: Mahesh, age: 21 ]
{
"name" : "Mahesh",
"age" : 21
}
Gson - 物件序列化
讓我們將 Java 物件序列化為 Json 檔案,然後讀取該 Json 檔案以獲取物件。在此示例中,我們建立了一個Student類。我們將建立一個student.json檔案,其中包含Student物件的json表示形式。
示例
在C:\>GSON_WORKSPACE中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonTester {
public static void main(String args[]) {
GsonTester tester = new GsonTester();
try {
Student student = new Student();
student.setAge(10);
student.setName("Mahesh");
tester.writeJSON(student);
Student student1 = tester.readJSON();
System.out.println(student1);
}
catch(FileNotFoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
private void writeJSON(Student student) throws IOException {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
FileWriter writer = new FileWriter("student.json");
writer.write(gson.toJson(student));
writer.close();
}
private Student readJSON() throws FileNotFoundException {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
BufferedReader bufferedReader = new BufferedReader(
new FileReader("student.json"));
Student student = gson.fromJson(bufferedReader, Student.class);
return student;
}
}
class Student {
private String name;
private int age;
public Student(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student [ name: "+name+", age: "+ age+ " ]";
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行 GsonTester 以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出
Student [ name: Mahesh, age: 10 ]
Gson - 資料繫結
資料繫結 API 用於使用屬性訪問器或註釋將 JSON 轉換為 POJO(普通舊 Java 物件)並從 POJO 轉換。它有兩種型別。
基本資料繫結 - 將 JSON 轉換為 Java Map、List、String、Number、Boolean 和 NULL 物件,以及從這些型別轉換。
物件資料繫結 - 將 JSON 轉換為任何 JAVA 型別,以及從任何 JAVA 型別轉換。
Gson 讀取/寫入這兩種型別的資料繫結的 JSON。資料繫結類似於 XML 的 JAXB 解析器。
基本資料繫結
基本資料繫結指的是將 JSON 對映到 JAVA 核心資料型別和內建集合。Gson 提供各種內建介面卡,可用於序列化/反序列化基本資料型別。
示例
讓我們看看基本資料繫結在實際中的應用。在這裡,我們將 JAVA 基本型別直接對映到 JSON,反之亦然。
在C:\>Gson_WORKSPACE中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import java.util.Arrays;
import com.google.gson.Gson;
public class GsonTester {
public static void main(String args[]) {
Gson gson = new Gson();
String name = "Mahesh Kumar";
long rollNo = 1;
boolean verified = false;
int[] marks = {100,90,85};
//Serialization
System.out.println("{");
System.out.println("name: " + gson.toJson(name) +",");
System.out.println("rollNo: " + gson.toJson(rollNo) +",");
System.out.println("verified: " + gson.toJson(verified) +",");
System.out.println("marks:" + gson.toJson(marks));
System.out.println("}");
//De-serialization
name = gson.fromJson("\"Mahesh Kumar\"", String.class);
rollNo = gson.fromJson("1", Long.class);
verified = gson.fromJson("false", Boolean.class);
marks = gson.fromJson("[100,90,85]", int[].class);
System.out.println("name: " + name);
System.out.println("rollNo: " + rollNo);
System.out.println("verified: " +verified);
System.out.println("marks:" + Arrays.toString(marks));
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{
name: "Mahesh Kumar",
rollNo: 1,
verified: false,
marks:[100,90,85]
}
name: Mahesh Kumar
rollNo: 1
verified: false
marks:[100, 90, 85]
Gson - 物件資料繫結
物件資料繫結指的是將 JSON 對映到任何 JAVA 物件。
//Create a Gson instance Gson gson = new Gson(); //map Student object to JSON content String jsonString = gson.toJson(student); //map JSON content to Student object Student student1 = gson.fromJson(jsonString, Student.class);
示例
讓我們看看物件資料繫結在實際中的應用。在這裡,我們將 JAVA 物件直接對映到 JSON,反之亦然。
在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
public class GsonTester {
public static void main(String args[]) {
Gson gson = new Gson();
Student student = new Student();
student.setAge(10);
student.setName("Mahesh");
String jsonString = gson.toJson(student);
System.out.println(jsonString);
Student student1 = gson.fromJson(jsonString, Student.class);
System.out.println(student1);
}
}
class Student {
private String name;
private int age;
public Student(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student [ name: "+name+", age: "+ age+ " ]";
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{"name":"Mahesh","age":10}
Student [ name: Mahesh, age: 10 ]
Gson - 樹模型
樹模型準備 JSON 文件的記憶體樹表示。它構建了一個 JsonObject 節點的樹。這是一種靈活的方法,類似於 XML 的 DOM 解析器。
從 JSON 建立樹
JsonParser 在讀取 JSON 後提供指向樹根節點的指標。根節點可用於遍歷整個樹。請考慮以下程式碼片段以獲取提供的 JSON 字串的根節點。
//Create an JsonParser instance
JsonParser parser = new JsonParser();
String jsonString =
"{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
//create tree from JSON
JsonElement rootNode = parser.parse(jsonString);
遍歷樹模型
在遍歷樹時,使用相對於根節點的相對路徑獲取每個節點並處理資料。以下程式碼片段顯示瞭如何遍歷樹。
JsonObject details = rootNode.getAsJsonObject();
JsonElement nameNode = details.get("name");
System.out.println("Name: " +nameNode.getAsString());
JsonElement ageNode = details.get("age");
System.out.println("Age: " + ageNode.getAsInt());
示例
在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
public class GsonTester {
public static void main(String args[]) {
String jsonString =
"{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
JsonParser parser = new JsonParser();
JsonElement rootNode = parser.parse(jsonString);
if (rootNode.isJsonObject()) {
JsonObject details = rootNode.getAsJsonObject();
JsonElement nameNode = details.get("name");
System.out.println("Name: " +nameNode.getAsString());
JsonElement ageNode = details.get("age");
System.out.println("Age: " + ageNode.getAsInt());
JsonElement verifiedNode = details.get("verified");
System.out.println("Verified: " + (verifiedNode.getAsBoolean() ? "Yes":"No"));
JsonArray marks = details.getAsJsonArray("marks");
for (int i = 0; i < marks.size(); i++) {
JsonPrimitive value = marks.get(i).getAsJsonPrimitive();
System.out.print(value.getAsInt() + " ");
}
}
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
Name: Mahesh Kumar Age: 21 Verified: No 100 90 85
Gson - 流處理
流式 API 用於逐個讀取 JSON 令牌。它以離散事件的形式讀取和寫入 JSON 內容。JsonReader 和 JsonWriter 以令牌形式讀取/寫入資料,稱為JsonToken。
它是三種處理 JSON 方法中最強大的方法。它具有最低的開銷,並且在讀/寫操作中非常快。它類似於 XML 的 Stax 解析器。
在本章中,我們將展示使用 GSON 流式 API 讀取 JSON 資料的用法。流式 API 使用令牌的概念,JSON 的每個細節都必須小心處理。
//create JsonReader object and pass it the json source or json text.
JsonReader reader = new JsonReader(new StringReader(jsonString));
//start reading json
reader.beginObject();
//get the next token
JsonToken token = reader.peek();
//check the type of the token
if (token.equals(JsonToken.NAME)) {
//get the current token
fieldname = reader.nextName();
}
示例
讓我們看看JsonReader在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import java.io.IOException;
import java.io.StringReader;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
public class GsonTester {
public static void main(String args[]) {
String jsonString =
"{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
JsonReader reader = new JsonReader(new StringReader(jsonString));
try {
handleJsonObject(reader);
}
catch (IOException e) {
e.printStackTrace();
}
}
private static void handleJsonObject(JsonReader reader) throws IOException {
reader.beginObject();
String fieldname = null;
while (reader.hasNext()) {
JsonToken token = reader.peek();
if (token.equals(JsonToken.BEGIN_ARRAY)) {
System.out.print("Marks [ ");
handleJsonArray(reader);
System.out.print("]");
} else if (token.equals(JsonToken.END_OBJECT)) {
reader.endObject();
return;
} else {
if (token.equals(JsonToken.NAME)) {
//get the current token
fieldname = reader.nextName();
}
if ("name".equals(fieldname)) {
//move to next token
token = reader.peek();
System.out.println("Name: "+reader.nextString());
}
if("age".equals(fieldname)) {
//move to next token
token = reader.peek();
System.out.println("Age:" + reader.nextInt());
}
if("verified".equals(fieldname)) {
//move to next token
token = reader.peek();
System.out.println("Verified:" + reader.nextBoolean());
}
}
}
}
private static void handleJsonArray(JsonReader reader) throws IOException {
reader.beginArray();
String fieldname = null;
while (true) {
JsonToken token = reader.peek();
if (token.equals(JsonToken.END_ARRAY)) {
reader.endArray();
break;
} else if (token.equals(JsonToken.BEGIN_OBJECT)) {
handleJsonObject(reader);
} else if (token.equals(JsonToken.END_OBJECT)) {
reader.endObject();
} else {
System.out.print(reader.nextInt() + " ");
}
}
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
Name: Mahesh Kumar Age:21 Verified:false Marks [ 100 90 85 ]
Gson - 序列化示例
在本章中,我們將討論陣列、集合和泛型的序列化/反序列化。
陣列示例
int[] marks = {100,90,85};
//Serialization
System.out.println("marks:" + gson.toJson(marks));
//De-serialization
marks = gson.fromJson("[100,90,85]", int[].class);
System.out.println("marks:" + Arrays.toString(marks));
示例
讓我們看看陣列序列化/反序列化在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import java.util.Arrays;
import com.google.gson.Gson;
public class GsonTester {
public static void main(String args[]) {
Gson gson = new Gson();
int[] marks = {100,90,85};
String[] names = {"Ram","Shyam","Mohan"};
//Serialization
System.out.print("{");
System.out.print("marks:" + gson.toJson(marks) + ",");
System.out.print("names:" + gson.toJson(names));
System.out.println("}");
//De-serialization
marks = gson.fromJson("[100,90,85]", int[].class);
names = gson.fromJson("[\"Ram\",\"Shyam\",\"Mohan\"]", String[].class);
System.out.println("marks:" + Arrays.toString(marks));
System.out.println("names:" + Arrays.toString(names));
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行 GsonTester 以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{marks:[100,90,85],names:["Ram","Shyam","Mohan"]}
marks:[100, 90, 85]
names:[Ram, Shyam, Mohan]
集合示例
List marks = new ArrayList();
//Serialization
System.out.println("marks:" + gson.toJson(marks));
//De-serialization
//get the type of the collection.
Type listType = new TypeToken<list>(){}.getType();
//pass the type of collection
marks = gson.fromJson("[100,90,85]", listType);
System.out.println("marks:" +marks);</list>
示例
讓我們看看集合序列化/反序列化在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class GsonTester {
public static void main(String args[]) {
Gson gson = new Gson();
Collection<Integer> marks = new ArrayList<Integer>();
marks.add(100);
marks.add(90);
marks.add(85);
//Serialization
System.out.print("{");
System.out.print("marks:" + gson.toJson(marks));
System.out.println("}");
//De-serialization
Type listType = new TypeToken<Collection<Integer>>(){}.getType();
marks = gson.fromJson("[100,90,85]", listType);
System.out.println("marks:" +marks);
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{marks:[100,90,85]}
marks:[100, 90, 85]
泛型示例
Gson 使用 Java 反射 API 獲取要將 Json 文字對映到的物件的型別。但是對於泛型,此資訊在序列化期間會丟失。為了解決此問題,Gson 提供了一個類com.google.gson.reflect.TypeToken來儲存泛型物件的型別。
示例
讓我們看看泛型序列化/反序列化在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class GsonTester {
public static void main(String args[]) {
// create a shape class of type circle.
Shape<Circle> shape = new Shape<Circle>();
// Create a Circle object
Circle circle = new Circle(5.0);
//assign circle to shape
shape.setShape(circle);
Gson gson = new Gson();
// Define a Type shapeType of type circle.
Type shapeType = new TypeToken<Shape<Circle>>() {}.getType();
//Serialize the json as ShapeType
String jsonString = gson.toJson(shape, shapeType);
System.out.println(jsonString);
Shape shape1 = gson.fromJson(jsonString, Shape.class);
System.out.println(shape1.get().getClass());
System.out.println(shape1.get().toString());
System.out.println(shape1.getArea());
Shape shape2 = gson.fromJson(jsonString, shapeType);
System.out.println(shape2.get().getClass());
System.out.println(shape2.get().toString());
System.out.println(shape2.getArea());
}
}
class Shape <T> {
public T shape;
public void setShape(T shape) {
this.shape = shape;
}
public T get() {
return shape;
}
public double getArea() {
if(shape instanceof Circle) {
return ((Circle) shape).getArea();
} else {
return 0.0;
}
}
}
class Circle {
private double radius;
public Circle(double radius){
this.radius = radius;
}
public String toString() {
return "Circle";
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
return (radius*radius*3.14);
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{"shape":{"radius":5.0}}
class com.google.gson.internal.LinkedTreeMap
{radius = 5.0}
0.0
class Circle
Circle
78.5
Gson - 序列化內部類
在本章中,我們將解釋具有內部類的類的序列化/反序列化。
巢狀內部類示例
Student student = new Student(); student.setRollNo(1); Student.Name name = student.new Name(); name.firstName = "Mahesh"; name.lastName = "Kumar"; student.setName(name); //serialize inner class object String nameString = gson.toJson(name); System.out.println(nameString); //deserialize inner class object name = gson.fromJson(nameString,Student.Name.class); System.out.println(name.getClass());
示例
讓我們看看帶有內部類的類的序列化/反序列化示例在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
public class GsonTester {
public static void main(String args[]) {
Student student = new Student();
student.setRollNo(1);
Student.Name name = student.new Name();
name.firstName = "Mahesh";
name.lastName = "Kumar";
student.setName(name);
Gson gson = new Gson();
String jsonString = gson.toJson(student);
System.out.println(jsonString);
student = gson.fromJson(jsonString, Student.class);
System.out.println("Roll No: "+ student.getRollNo());
System.out.println("First Name: "+ student.getName().firstName);
System.out.println("Last Name: "+ student.getName().lastName);
String nameString = gson.toJson(name);
System.out.println(nameString);
name = gson.fromJson(nameString,Student.Name.class);
System.out.println(name.getClass());
System.out.println("First Name: "+ name.firstName);
System.out.println("Last Name: "+ name.lastName);
}
}
class Student {
private int rollNo;
private Name name;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
class Name {
public String firstName;
public String lastName;
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行 GsonTester 以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{"rollNo":1,"name":{"firstName":"Mahesh","lastName":"Kumar"}}
Roll No: 1
First Name: Mahesh
Last Name: Kumar
{"firstName":"Mahesh","lastName":"Kumar"}
class Student$Name
First Name: Mahesh
Last Name: Kumar
巢狀靜態內部類示例
Student student = new Student(); student.setRollNo(1); Student.Name name = new Student.Name(); name.firstName = "Mahesh"; name.lastName = "Kumar"; student.setName(name); //serialize static inner class object String nameString = gson.toJson(name); System.out.println(nameString); //deserialize static inner class object name = gson.fromJson(nameString,Student.Name.class); System.out.println(name.getClass());
示例
讓我們看看帶有靜態內部類的類的序列化/反序列化示例在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為 GsonTester 的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
public class GsonTester {
public static void main(String args[]) {
Student student = new Student();
student.setRollNo(1);
Student.Name name = new Student.Name();
name.firstName = "Mahesh";
name.lastName = "Kumar";
student.setName(name);
Gson gson = new Gson();
String jsonString = gson.toJson(student);
System.out.println(jsonString);
student = gson.fromJson(jsonString, Student.class);
System.out.println("Roll No: "+ student.getRollNo());
System.out.println("First Name: "+ student.getName().firstName);
System.out.println("Last Name: "+ student.getName().lastName);
String nameString = gson.toJson(name);
System.out.println(nameString);
name = gson.fromJson(nameString,Student.Name.class);
System.out.println(name.getClass());
System.out.println("First Name: "+ name.firstName);
System.out.println("Last Name: "+ name.lastName);
}
}
class Student {
private int rollNo;
private Name name;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
static class Name {
public String firstName;
public String lastName;
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{"rollNo":1,"name":{"firstName":"Mahesh","lastName":"Kumar"}}
Roll No: 1
First Name: Mahesh
Last Name: Kumar
{"firstName":"Mahesh","lastName":"Kumar"}
class Student$Name
First Name: Mahesh
Last Name: Kumar
Gson - 自定義型別介面卡
Gson 使用其內建介面卡執行物件的序列化/反序列化。它也支援自定義介面卡。讓我們討論如何建立自定義介面卡以及如何使用它。
建立自定義介面卡
透過擴充套件TypeAdapter類並傳遞目標物件的型別來建立自定義介面卡。覆蓋read和write方法分別執行自定義反序列化和序列化。
class StudentAdapter extends TypeAdapter<Student> {
@Override
public Student read(JsonReader reader) throws IOException {
...
}
@Override
public void write(JsonWriter writer, Student student) throws IOException {
}
}
註冊自定義介面卡
使用 GsonBuilder 註冊自定義介面卡,並使用GsonBuilder建立 Gson 例項。
GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Student.class, new StudentAdapter()); Gson gson = builder.create();
使用介面卡
Gson 現在將使用自定義介面卡將 Json 文字轉換為物件,反之亦然。
String jsonString = "{\"name\":\"Mahesh\", \"rollNo\":1}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);
示例
讓我們看看自定義型別介面卡在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import java.io.IOException;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
public class GsonTester {
public static void main(String args[]) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Student.class, new StudentAdapter());
builder.setPrettyPrinting();
Gson gson = builder.create();
String jsonString = "{\"name\":\"Mahesh\", \"rollNo\":1}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
class StudentAdapter extends TypeAdapter<Student> {
@Override
public Student read(JsonReader reader) throws IOException {
Student student = new Student();
reader.beginObject();
String fieldname = null;
while (reader.hasNext()) {
JsonToken token = reader.peek();
if (token.equals(JsonToken.NAME)) {
//get the current token
fieldname = reader.nextName();
}
if ("name".equals(fieldname)) {
//move to next token
token = reader.peek();
student.setName(reader.nextString());
}
if("rollNo".equals(fieldname)) {
//move to next token
token = reader.peek();
student.setRollNo(reader.nextInt());
}
}
reader.endObject();
return student;
}
@Override
public void write(JsonWriter writer, Student student) throws IOException {
writer.beginObject();
writer.name("name");
writer.value(student.getName());
writer.name("rollNo");
writer.value(student.getRollNo());
writer.endObject();
}
}
class Student {
private int rollNo;
private String name;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Student[ name = "+name+", roll no: "+rollNo+ "]";
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
Student[ name = Mahesh, roll no: 1]
{
"name": "Mahesh",
"rollNo": 1
}
Gson - 空物件支援
Gson 預設情況下會生成最佳化的 Json 內容,忽略 NULL 值。但是 GsonBuilder 提供標誌,可以使用GsonBuilder.serializeNulls()方法在 Json 輸出中顯示 NULL 值。
GsonBuilder builder = new GsonBuilder(); builder.serializeNulls(); Gson gson = builder.create();
不呼叫 serializeNulls 的示例
在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
public class GsonTester {
public static void main(String args[]) {
Gson gson = new Gson();
Student student = new Student();
student.setRollNo(1);
String jsonString = gson.toJson(student);
System.out.println(jsonString);
student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
}
}
class Student {
private int rollNo;
private String name;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Student[ name = "+name+", roll no: "+rollNo+ "]";
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行 GsonTester 以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{"rollNo": 1}
Student[ name = null, roll no: 1]
呼叫 serializeNulls 的示例
在 C:\>GSON_WORKSPACE 中建立一個名為 GsonTester 的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonTester {
public static void main(String args[]) {
GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
builder.setPrettyPrinting();
Gson gson = builder.create();
Student student = new Student();
student.setRollNo(1);
String jsonString = gson.toJson(student);
System.out.println(jsonString);
student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
}
}
class Student {
private int rollNo;
private String name;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Student[ name = "+name+", roll no: "+rollNo+ "]";
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{
"rollNo": 1,
"name": null
}
Student[ name = null, roll no: 1]
Gson - 版本支援
Gson 提供@Since註釋以根據類的不同版本控制類的 Json 序列化/反序列化。請考慮以下具有版本控制支援的類。在這個類中,我們最初定義了兩個變數rollNo和name,後來我們添加了verified作為新變數。使用 @Since,我們將rollNo和name定義為版本 1.0,將 verified 定義為版本 1.1。
class Student {
@Since(1.0)
private int rollNo;
@Since(1.0)
private String name;
@Since(1.1)
private boolean verified;
}
GsonBuilder 提供setVersion()方法來序列化此類版本化的類。
GsonBuilder builder = new GsonBuilder(); builder.setVersion(1.0); Gson gson = builder.create();
示例
讓我們看看版本控制支援在實際中的應用。在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Since;
public class GsonTester {
public static void main(String args[]) {
GsonBuilder builder = new GsonBuilder();
builder.setVersion(1.0);
Gson gson = builder.create();
Student student = new Student();
student.setRollNo(1);
student.setName("Mahesh Kumar");
student.setVerified(true);
String jsonString = gson.toJson(student);
System.out.println(jsonString);
gson = new Gson();
jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
class Student {
@Since(1.0)
private int rollNo;
@Since(1.0)
private String name;
@Since(1.1)
private boolean verified;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
public boolean isVerified() {
return verified;
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行 GsonTester 以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出。
{"rollNo":1,"name":"Mahesh Kumar"}
{"rollNo":1,"name":"Mahesh Kumar","verified":true}
Gson - 從序列化中排除欄位
預設情況下,GSON 會從序列化/反序列化過程中排除 transient 和 static 欄位。讓我們看看下面的例子。
示例
在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonTester {
public static void main(String args[]) {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
Student student = new Student();
student.setRollNo(1);
student.setName("Mahesh Kumar");
student.setVerified(true);
student.setId(1);
student.className = "VI";
String jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
class Student {
private int rollNo;
private String name;
private boolean verified;
private transient int id;
public static String className;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
public boolean isVerified() {
return verified;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出
{"rollNo":1,"name":"Mahesh Kumar","verified":true}
使用 excludeFieldsWithModifiers
GsonBuilder 提供了使用 excludeFieldsWithModifiers() 方法從序列化/反序列化過程中排除具有特定修飾符的欄位的控制權。請參閱以下示例。
示例
在 C:\>GSON_WORKSPACE 中建立一個名為 GsonTester 的 Java 類檔案。
檔案 - GsonTester.java
import java.lang.reflect.Modifier;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonTester {
public static void main(String args[]) {
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithModifiers(Modifier.TRANSIENT);
Gson gson = builder.create();
Student student = new Student();
student.setRollNo(1);
student.setName("Mahesh Kumar");
student.setVerified(true);
student.setId(1);
student.className = "VI";
String jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
class Student {
private int rollNo;
private String name;
private boolean verified;
private transient int id;
public static String className;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
public boolean isVerified() {
return verified;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出
{"rollNo":1,"name":"Mahesh Kumar","verified":true,"className":"VI"}
使用 @Expose 註釋
Gson 提供@Expose註釋以根據其作用域控制類的 Json 序列化/反序列化。請考慮以下具有@Expose支援的變數的類。在此類中,name和rollno變數要公開進行序列化。然後,我們使用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法來指示僅序列化/反序列化公開的變數。請參閱以下示例。
示例
在 C:\>GSON_WORKSPACE 中建立一個名為GsonTester的 Java 類檔案。
檔案 - GsonTester.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
public class GsonTester {
public static void main(String args[]) {
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
Student student = new Student();
student.setRollNo(1);
student.setName("Mahesh Kumar");
student.setVerified(true);
student.setId(1);
student.className = "VI";
String jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
class Student {
@Expose
private int rollNo;
@Expose
private String name;
private boolean verified;
private int id;
public static String className;
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
public boolean isVerified() {
return verified;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
驗證結果
使用 javac 編譯器編譯類,如下所示:
C:\GSON_WORKSPACE>javac GsonTester.java
現在執行GsonTester以檢視結果:
C:\GSON_WORKSPACE>java GsonTester
驗證輸出
{"rollNo":1,"name":"Mahesh Kumar"}