Gson 简明教程

Gson - Quick Guide

Gson - Overview

Google Gson 是一个简单的基于 Java 的库,用于序列化 Java 对象到 JSON,反之亦然。它是由 Google 开发的开源库。

以下各点突出了你为何应该使用该库——

  1. Standardized − Gson 是由 Google 管理的标准化库。

  2. Efficient − 它是对 Java 标准库的一个可靠、快速且高效的扩展。

  3. Optimized − 该库经过高度优化。

  4. Support Generics − 它为泛型提供了广泛的支持。

  5. Supports complex inner classes − 它支持具有深度继承层次结构的复杂对象。

Features of Gson

以下是 Gson 的一些最突出特点的列表——

  1. Easy to use − Gson API 提供了一个高级门面来简化常用的用例。

  2. No need to create mapping − Gson API 为要序列化的大多数对象提供了默认映射。

  3. Performance − Gson 非常快速,且内存占用少。它适用于大型对象图或系统。

  4. Clean JSON − Gson 创建了一个简洁紧凑的 JSON 结果,易于阅读。

  5. No Dependency − Gson 库不需要除 JDK 之外的任何其他库。

  6. Open Source − Gson 库是开源的;它可以免费获取。

Three Ways of Processing JSON

Gson 提供三种 JSON 处理备选方案——

Streaming API

它将 JSON 内容读入和写入为离散事件。 JsonReaderJsonWriter 以 token 形式读/写数据,称为 JsonToken

在三种处理 JSON 的方法中它是最强大的方法。它开销最低而且读/写操作非常快。它类似于 XML 的 Stax 解析器。

Tree Model

它准备一个 JSON 文档的内存树表示。它构建一个 JsonObject 节点树。它是一种灵活的方法,类似于 XML 的 DOM 解析器。

Data Binding

它使用属性访问器将 JSON 转换为 POJO(普通旧 Java 对象)以及从它们转换 JSON。Gson 使用数据类型适配器读/写 JSON。它类似于 XML 的 JAXB 解析器。

Gson - Environment Setup

Local Environment Setup

如果你仍然想为 Java 编程语言设置本地环境,那么本部分将指导你如何在计算机上下载和设置 Java。请按照以下给出的步骤设置环境。

Java SE 可以从链接 Download Java 免费获得。因此,你可以根据你的操作系统下载一个版本。

按照说明下载 Java 并运行 .exe ,在您的机器上安装 Java。在您的机器上安装 Java 后,您需要设置环境变量以指向它们正确的安装目录。

Setting up the Path in Windows 2000/XP

假设你已将 Java 安装在 c:\Program Files\java\jdk 目录中 −

  1. 右键单击“我的电脑”,然后选择“属性”。

  2. 单击“高级”选项卡下的“环境变量”按钮。

  3. 接下来,修改“Path”变量,以便它还包含 Java 执行文件的路径。例如,如果路径当前设置为“C:\WINDOWS\SYSTEM32”,那么将您的路径更改为读取“C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin”。

Setting up the Path in Windows 95 / 98 / ME

假设你已将 Java 安装在 c:\Program Files\java\jdk 目录中 −

  1. 编辑“C:\autoexec.bat”文件并在末尾添加以下行:“SET PATH=%PATH%;C:\Program Files\java\jdk\bin”

Setting up the Path for Linux, UNIX, Solaris, FreeBSD

环境变量 PATH 应该被设置为指向已安装 Java 二进制文件的位置。如果您这样做遇到问题,请参阅您的 shell 文档。

例如,如果您使用 bash 作为您的 shell,那么您将在您的“'bashrc: export PATH=/path/ to/java:$PATH'”末尾添加以下行。

要编写您的 Java 程序,您将需要一个文本编辑器。市场上有许多成熟的 IDE 可用。但现在,您可以考虑以下之一 −

  1. Notepad − 在 Windows 上,您可以使用任何简单的文本编辑器,如记事本(推荐用于此教程)或 TextPad。

  2. Netbeans − 它是开源的、免费的 Java IDE,可以从 https://netbeans.org/index.html 下载。

  3. Eclipse − 它也是由 Eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 下载。

Download Gson Archive

gson-2.3.1.jar 下载 Gson jar 文件的最新版本。在撰写本教程时,我们下载了 gson-2.3.1.jar 并将其复制到了 C:\>gson 文件夹。

OS

Archive name

Windows

gson-2.3.1.jar

Linux

gson-2.3.1.jar

Mac

gson-2.3.1.jar

Set Gson Environment

设置 GSON_HOME 环境变量,使其指向 Gson jar 在您的机器上存储的基本目录位置。

OS

Output

Windows

将环境变量 GSON_HOME 设置为 C:\gson

Linux

export GSON_HOME=/usr/local/gson

Mac

export GSON_HOME=/Library/gson

Set CLASSPATH variable

设置 CLASSPATH 环境变量以指向 Gson jar 位置。

OS

Output

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 - First Application

在详细了解 Google Gson 库之前,让我们来看看一个示例是如何发挥作用的。在此示例中,我们创建了一个 Student 类。我们将使用学生详细信息创建一个 JSON 字符串,并将其反序列化为 student 对象,然后将其序列化为 JSON 字符串。

Example

在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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+ " ]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 来查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

Student [ name: Mahesh, age: 21 ]
{
   "name" : "Mahesh",
   "age" : 21
}

Steps to Remember

以下是需要考虑的重要步骤。

Step 1 − Create Gson object using GsonBuilder

创建一个 Gson 对象,这是一个可重用对象。

GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();

Step 2 − Deserialize JSON to Object

使用 fromJson() 方法从 JSON 中获取对象,将 Json 字符串/Json 字符串源和对象类型作为参数传入。

//Object to JSON Conversion
Student student = gson.fromJson(jsonString, Student.class);

Step 3 − Serialize Object to JSON

使用 toJson() 方法获取一个对象的 JSON 字符串表示形式。

//Object to JSON Conversion
jsonString = gson.toJson(student);

Gson - Class

Gson 是 Google Gson 库的主要操作员类。它提供将 Java 对象转换成匹配 JSON 构造的过程,反之亦然。使用 GsonBuilder 首先构建 Gson,然后使用 toJson(Object) 或 fromJson(String, Class) 方法来读/写 JSON 构造。

Class Declaration

以下为 com.google.gson.Gson 类的声明 −

public final class Gson
   extends Object

Constructors

Sr.No

Constructor & Description

1

Gson() 使用默认配置构建 Gson 对象。

Class Methods

Sr.No

Method & Description

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) 此方法将从指定读取器中读取的 Json 反序列化为指定类的对象。

5

<T> T fromJson(Reader json, Type typeOfT) 此方法将从指定读取器中读取的 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) 返回类型的类型适配器。

9

<T> TypeAdapter<T> getAdapter(TypeToken<T> 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) 此方法将指定对象序列化为其等效的 Json 表示形式。

15

void toJson(Object src, Appendable writer) 此方法将指定对象序列化为其等效的 Json 表示形式。

16

String toJson(Object src, Type typeOfSrc) 此方法将指定对象(包括泛型类型的对象)序列化为其等效的 Json 表示形式。

17

void toJson(Object src, Type typeOfSrc, Appendable writer) 此方法将指定对象(包括泛型类型的对象)序列化为其等效的 Json 表示形式。

18

void toJson(Object src, Type typeOfSrc, JsonWriter writer) 将 typeOfSrc 类型的 src 的 JSON 表示形式写入 writer。

19

JsonElement toJsonTree(Object src) 此方法将指定对象序列化为其作为 JsonElements 树的同等表示形式。

20

JsonElement toJsonTree(Object src, Type typeOfSrc) 此方法将指定对象(包括泛型类型的对象)序列化为其作为 JsonElements 树的同等表示形式。

21

String toString()

Methods inherited

此类从以下类继承方法 −

  1. java.lang.Object

Example

在任何您选择的编辑器中创建以下 Java 程序,并将它保存在,比如,C:/> GSON_WORKSPACE

File − 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+ " ]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 来查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出

Student [ name: Mahesh, age: 21 ]
{
   "name" : "Mahesh",
   "age" : 21
}

Gson - Object Serialization

让我们将 Java 对象序列化到 Json 文件,然后读取该 Json 文件以返回该对象。在此示例中,我们创建了 Student 类。我们将创建一个 student.json 文件,该文件将有一个 jsonStudent 对象表示形式。

Example

C:>GSON_WORKSPACE 中创建名为 GsonTester 的 Java 类文件。

File - 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+ " ]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 来查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出

Student [ name: Mahesh, age: 10 ]

Gson - Data Binding

数据绑定 API 用于使用属性访问器或注释将 JSON 转换为 POJO(纯旧 Java 对象)并从 POJO 转换回来。它有两种类型。

  1. Primitives Data Binding − 将 JSON 转换为 Java 映射、列表、字符串、数字、布尔值和 NULL 对象,并从它们转换回来。

  2. Objects Data Binding − 将 JSON 转换为任何 JAVA 类型,并从任何 JAVA 类型转换回来。

Gson 读写 JSON,针对两种数据绑定。数据绑定类似于用于 XML 的 JAXB 解析器。

Primitives Data Binding

原始数据绑定是指将 JSON 映射到 JAVA 核心数据类型和内置集合。Gson 提供了各种内置适配器,可用于序列化/反序列化原始数据类型。

Example

让我们看看原始数据绑定的实际应用。在这里,我们将直接将 JAVA 基本类型映射到 JSON,反之亦然。

C:>Gson_WORKSPACE 中创建名为 GsonTester 的 Java 类文件。

File − 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));
   }
}

Verify the result

使用以下 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 - Object Data Binding

对象数据绑定是指 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);

Example

让我们看看对象数据绑定在实际使用中的情况。在这里,我们将直接将 JAVA 对象映射到 JSON,反之亦然。

在 C:\>GSON_WORKSPACE 创建一个名为 GsonTester 的 Java 类文件。

File - 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+ " ]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

{"name":"Mahesh","age":10}
Student [ name: Mahesh, age: 10 ]

Gson - Tree Model

树形模型准备了一个 JSON 文档的内存树表示。它构建一个 JsonObject 节点树。它是一种灵活的方法,类似于 XML 的 DOM 解析器。

Create Tree from 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);

Traversing Tree Model

在遍历树形时,使用相对根节点的路径获取每个节点,并处理数据。以下代码片段展示了如何遍历树形。

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());

Example

在 C:\>GSON_WORKSPACE 创建一个名为 GsonTester 的 Java 类文件。

File − 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() + " ");
         }
      }
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

Name: Mahesh Kumar
Age: 21
Verified: No
100 90 85

Gson - Streaming

Streaming API 用于逐个读取 JSON token。它将 JSON 内容读入和写入为离散事件。 JsonReaderJsonWriter 以 token 形式读/写数据,称为 JsonToken

在三种处理 JSON 的方法中它是最强大的方法。它开销最低而且读/写操作非常快。它类似于 XML 的 Stax 解析器。

在本章中,我们将展示 GSON 流式 API 以读取 JSON 数据。流式 API 使用 token 的概念,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();
}

Example

让我们看看 JsonReader 如何发挥作用。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File - 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() + " ");
         }
      }
   }
}

Verify the result

使用以下 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 - Serialization Examples

在本章中,我们将讨论数组、集合和泛型的序列化/反序列化。

Array Example

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));

Example

让我们看看 Array 序列化/反序列化如何发挥作用。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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));
   }
}

Verify the result

使用以下 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]

Collections Example

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>

Example

让我们看看 Collection 序列化/反序列化如何发挥作用。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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);
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

{marks:[100,90,85]}
marks:[100, 90, 85]

Generics Example

Gson 使用 Java 反射 API 来获取 Json 文本要映射到的对象的类型。但是对于泛型,此信息会在序列化期间丢失。为了解决这个问题,Gson 提供了一个名为 com.google.gson.reflect.TypeToken 的类来存储泛型对象的类型。

Example

让我们看看 Generics 序列化/反序列化如何发挥作用。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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);
   }
}

Verify the result

使用以下 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 - Serializing Inner Classes

在本章中,我们将讲解包含内部类的类的序列化/反序列化。

Nested Inner Class example

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());

Example

让我们看一个序列化/反序列化带有内部类的类的示例。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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;
   }
}

Verify the result

使用以下 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

Nested Static Inner Class Example

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());

Example

让我们看一个序列化/反序列化带有静态内部类的类的示例。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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;
   }
}

Verify the result

使用以下 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 - Custom Type Adapters

Gson 使用其内置适配器执行对象的序列化/反序列化,它还支持自定义适配器。让我们讨论如何创建自定义适配器以及如何使用它。

Create a Custom Adapter

通过扩展 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 {
   }
}

Register the Custom Adapter

使用 GsonBuilder 注册自定义适配器,并使用 GsonBuilder 创建 Gson 实例。

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Student.class, new StudentAdapter());
Gson gson = builder.create();

Use the Adapter

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);

Example

让我们看一个自定义类型适配器的示例。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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+ "]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

Student[ name = Mahesh, roll no: 1]
{
   "name": "Mahesh",
   "rollNo": 1
}

Gson - Null Object Support

默认情况下,Gson 会忽略 NULL 值,生成经过优化的 Json 内容。但 GsonBuilder 提供了使用 GsonBuilder.serializeNulls() 方法在 Json 输出中显示 NULL 值的标志。

GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
Gson gson = builder.create();

Example without serializeNulls Call

在 C:\>GSON_WORKSPACE 创建一个名为 GsonTester 的 Java 类文件。

File - 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+ "]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 来查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

{"rollNo": 1}
Student[ name = null, roll no: 1]

Example with serializeNulls call

在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File - 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+ "]";
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出。

{
   "rollNo": 1,
   "name": null
}
Student[ name = null, roll no: 1]

Gson - Versioning Support

Gson 提供 @Since 注释来控制基于其不同版本的类的 Json 序列化/反序列化。考虑具有版本支持的以下类。在此类中,我们最初定义了两个变量 rollNoname ,然后我们在后面将 verified 添加为一个新变量。使用 @Since,我们定义了 rollNoname 为版本 1.0,并验证为版本 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();

Example

让我们看一个版本支持的示例。在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File - 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;
   }
}

Verify the result

使用以下 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 - Excluding fields from Serialization

默认情况下,GSON 会将瞬态和静态字段排除在序列化/反序列化过程中。让我们来看一下下面的示例。

Example

在 C:\>GSON_WORKSPACE 创建一个名为 GsonTester 的 Java 类文件。

File − 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;
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出

{"rollNo":1,"name":"Mahesh Kumar","verified":true}

Using excludeFieldsWithModifiers

GsonBuilder 提供对使用 excludeFieldsWithModifiers() 方法排除具有特殊修饰符的字段的控制,以排除序列化/反序列化过程。请参阅以下示例。

Example

在 C:\>GSON_WORKSPACE 中创建一个名为 GsonTester 的 Java 类文件。

File − 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;
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出

{"rollNo":1,"name":"Mahesh Kumar","verified":true,"className":"VI"}

Using @Expose Annotation

Gson 提供 @Expose 注释来控制基于类的作用域的 Json 序列化/反序列化。考虑具有变量具有 @Expose 支持的以下类。此类中, namerollno 变量公开序列化。然后,我们使用 GsonBuilder.excludeFieldsWithoutExposeAnnotation() 方法来指示仅公开变量将被序列化/反序列化。请参阅以下示例。

Example

在 C:\>GSON_WORKSPACE 创建一个名为 GsonTester 的 Java 类文件。

File − 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;
   }
}

Verify the result

使用以下 javac 编译器编译类:

C:\GSON_WORKSPACE>javac GsonTester.java

现在运行 GsonTester 以查看结果 −

C:\GSON_WORKSPACE>java GsonTester

验证输出

{"rollNo":1,"name":"Mahesh Kumar"}