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 內容讀寫為離散事件。JsonReaderJsonWriter 將資料讀/寫為標記,稱為 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 內容。JsonReaderJsonWriter 以令牌形式讀取/寫入資料,稱為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類並傳遞目標物件的型別來建立自定義介面卡。覆蓋readwrite方法分別執行自定義反序列化和序列化。

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 序列化/反序列化。請考慮以下具有版本控制支援的類。在這個類中,我們最初定義了兩個變數rollNoname,後來我們添加了verified作為新變數。使用 @Since,我們將rollNoname定義為版本 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支援的變數的類。在此類中,namerollno變數要公開進行序列化。然後,我們使用了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"} 
廣告

© . All rights reserved.