Gson 简明教程
Gson - Overview
Google Gson 是一个简单的基于 Java 的库,用于序列化 Java 对象到 JSON,反之亦然。它是由 Google 开发的开源库。
以下各点突出了你为何应该使用该库——
-
Standardized − Gson 是由 Google 管理的标准化库。
-
Efficient − 它是对 Java 标准库的一个可靠、快速且高效的扩展。
-
Optimized − 该库经过高度优化。
-
Support Generics − 它为泛型提供了广泛的支持。
-
Supports complex inner classes − 它支持具有深度继承层次结构的复杂对象。
Features of Gson
以下是 Gson 的一些最突出特点的列表——
-
Easy to use − Gson API 提供了一个高级门面来简化常用的用例。
-
No need to create mapping − Gson API 为要序列化的大多数对象提供了默认映射。
-
Performance − Gson 非常快速,且内存占用少。它适用于大型对象图或系统。
-
Clean JSON − Gson 创建了一个简洁紧凑的 JSON 结果,易于阅读。
-
No Dependency − Gson 库不需要除 JDK 之外的任何其他库。
-
Open Source − Gson 库是开源的;它可以免费获取。
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 目录中 −
-
右键单击“我的电脑”,然后选择“属性”。
-
单击“高级”选项卡下的“环境变量”按钮。
-
接下来,修改“Path”变量,以便它还包含 Java 执行文件的路径。例如,如果路径当前设置为“C:\WINDOWS\SYSTEM32”,那么将您的路径更改为读取“C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin”。
Popular Java Editors
要编写您的 Java 程序,您将需要一个文本编辑器。市场上有许多成熟的 IDE 可用。但现在,您可以考虑以下之一 −
-
Notepad − 在 Windows 上,您可以使用任何简单的文本编辑器,如记事本(推荐用于此教程)或 TextPad。
-
Netbeans − 它是开源的、免费的 Java IDE,可以从 https://netbeans.org/index.html 下载。
-
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 |
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();
Gson - Class
Gson 是 Google Gson 库的主要操作员类。它提供将 Java 对象转换成匹配 JSON 构造的过程,反之亦然。使用 GsonBuilder 首先构建 Gson,然后使用 toJson(Object) 或 fromJson(String, Class) 方法来读/写 JSON 构造。
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
此类从以下类继承方法 −
-
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+ " ]";
}
}
Gson - Object Serialization
让我们将 Java 对象序列化到 Json 文件,然后读取该 Json 文件以返回该对象。在此示例中,我们创建了 Student 类。我们将创建一个 student.json 文件,该文件将有一个 json 的 Student 对象表示形式。
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+ " ]";
}
}
Gson - Data Binding
数据绑定 API 用于使用属性访问器或注释将 JSON 转换为 POJO(纯旧 Java 对象)并从 POJO 转换回来。它有两种类型。
-
Primitives Data Binding − 将 JSON 转换为 Java 映射、列表、字符串、数字、布尔值和 NULL 对象,并从它们转换回来。
-
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));
}
}
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+ " ]";
}
}
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() + " ");
}
}
}
}
Gson - Streaming
Streaming API 用于逐个读取 JSON token。它将 JSON 内容读入和写入为离散事件。 JsonReader 和 JsonWriter 以 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() + " ");
}
}
}
}
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));
}
}
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);
}
}
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);
}
}
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 类并向其传入目标对象类型来创建自定义适配器。覆盖 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 {
}
}
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+ "]";
}
}
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+ "]";
}
}
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+ "]";
}
}
Gson - Versioning Support
Gson 提供 @Since 注释来控制基于其不同版本的类的 Json 序列化/反序列化。考虑具有版本支持的以下类。在此类中,我们最初定义了两个变量 rollNo 和 name ,然后我们在后面将 verified 添加为一个新变量。使用 @Since,我们定义了 rollNo 和 name 为版本 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;
}
}
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;
}
}
Using @Expose Annotation
Gson 提供 @Expose 注释来控制基于类的作用域的 Json 序列化/反序列化。考虑具有变量具有 @Expose 支持的以下类。此类中, name 和 rollno 变量公开序列化。然后,我们使用 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;
}
}