Gson - 快速指南
Gson - Overview
Google Gson是一个简单的基于Java的库,用于将Java对象序列化为JSON,反之亦然。 它是由Google开发的开源库。
以下几点强调了您应该使用此库的原因 -
Standardized - Gson是由Google管理的标准化库。
Efficient - 它是Java标准库的可靠,快速和高效的扩展。
Optimized - 库高度优化。
Support Generics - 它为泛型提供广泛的支持。
Supports complex inner classes - 它支持具有深层继承层次结构的复杂对象。
Gson的特点
以下列出了Gson的一些最突出的功能 -
Easy to use - Gson API提供了一个高级外观,以简化常用的用例。
No need to create mapping - Gson API为大多数要序列化的对象提供默认映射。
Performance - Gson速度非常快,内存占用少。 它适用于大型对象图或系统。
Clean JSON - Gson创建一个干净,紧凑的JSON结果,易于阅读。
No Dependency - 除了JDK之外,Gson库不需要任何其他库。
Open Source - Gson库是开源的; 它是免费提供的。
处理JSON的三种方法
Gson提供了三种处理JSON的替代方法 -
流式API
它将JSON内容读写为离散事件。 JsonReader和JsonWriter将数据读/写为令牌,称为JsonToken 。
它是处理JSON的三种方法中最强大的方法。 它具有最低的开销,并且在读/写操作中非常快。 它类似于XML的Stax解析器。
树模型
它准备了JSON文档的内存树表示。 它构建了一个JsonObject节点树。 它是一种灵活的方法,类似于XML的DOM解析器。
数据绑定
它使用属性访问器将JSON转换为POJO(Plain Old Java Object)。 Gson使用数据类型适配器读/写JSON。 它类似于XML的JAXB解析器。
Gson - Environment Setup
Try it Option Online
您不必设置自己的环境即可开始学习Gson。 我们已经为您建立了一个在线Java编程环境。 该平台允许您在线编译和执行所有可用示例,并使用不同选项分析输出。 我们相信它会增强您的信心,让您的学习成为一种愉快的活动。 随意修改任何示例并在线执行。
使用以下示例代码框右上角的“ Try it选项, Try it以下示例 -
public class MyFirstJavaProgram { public static void main(String []args) { System.out.println("Hello World"); } }
对于本教程中给出的大多数示例,您将找到Try it选项。 请使用此选项,享受您的学习。
本地环境设置 (Local Environment Setup)
如果您仍想为Java编程语言设置本地环境,那么本节将指导您如何在计算机上下载和设置Java。 请按照下面给出的步骤设置环境。
Java SE可从链接Download Java免费获得。 因此,您下载基于您的操作系统的版本。
按照说明下载Java并运行.exe以在您的计算机上安装Java。 在计算机上安装Java后,需要将环境变量设置为指向正确的安装目录。
在Windows 2000/XP中设置路径
假设您已在c:\Program Files\java\jdk目录中安装了Java -
右键单击“我的电脑”,然后选择“属性”。
单击“高级”选项卡下的“环境变量”按钮。
接下来,更改“Path”变量,使其还包含Java可执行文件的路径。 例如,如果路径当前设置为“C:\WINDOWS\SYSTEM32”,则将路径更改为“C:\WINDOWS\SYSTEM32; c:\Program Files\java\jdk\bin”。
在Windows 95/98/ME中设置路径
假设您已在c:\Program Files\java\jdk目录中安装了Java -
编辑'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编辑器 (Popular Java Editors)
要编写Java程序,您需要一个文本编辑器。 市场上有很多复杂的IDE。 但就目前而言,您可以考虑以下其中一项 -
Notepad - 在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文件夹中。
OS | 存档名称 |
---|---|
Windows | gson-2.3.1.jar |
Linux | gson-2.3.1.jar |
Mac | gson-2.3.1.jar |
设置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 |
设置CLASSPATH变量
将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+ " ]";
}
}
验证结果
使用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反序列化为Object
使用fromJson()方法从JSON获取Object。 将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 Class
Gson是Google Gson库的主要演员类。 它提供了将Java对象转换为匹配JSON结构的功能,反之亦然。 首先使用GsonBuilder构造Gson,然后使用toJson(Object)或fromJson(String,Class)方法来读/写JSON结构。
Class 声明 (Class Declaration)
以下是com.google.gson.Gson类的声明 -
public final class Gson
extends Object
构造函数 (Constructors)
S.No | 构造函数和描述 |
---|---|
1 | Gson() 使用默认配置构造Gson对象。 |
Class Methods
S.No | 方法和描述 |
---|---|
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() |
方法继承
该类继承以下类中的方法 -
- 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+ " ]";
}
}
验证结果
使用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文件,该文件将具有Student对象的json表示。
例子 (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+ " ]";
}
}
验证结果
使用javac编译器编译类如下 -
C:\GSON_WORKSPACE>javac GsonTester.java
现在运行GsonTester查看结果 -
C:\GSON_WORKSPACE>java GsonTester
验证输出
Student [ name: Mahesh, age: 10 ]
Gson - Data Binding
Data Binding API用于使用属性访问器或使用注释将JSON转换为POJO(Plain Old Java Object)和从POJO(Plain Old Java Object)转换JSON。 它有两种类型。
Primitives Data Binding - 将JSON转换为Java地图,列表,字符串,数字,布尔值和NULL对象。
Objects Data Binding - 将JSON转换为任何JAVA类型。
Gson为两种类型的数据绑定读取/写入JSON。 数据绑定类似于XML的JAXB解析器。
基元数据绑定
基本类型(Primitive)数据绑定是指将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));
}
}
验证结果
使用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 Object直接映射到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解析器。
从JSON创建树
在读取JSON之后,JsonParser提供指向树的根节点的指针。 根节点可用于遍历完整的树。 请考虑以下代码段以获取提供的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());
例子 (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() + " ");
}
}
}
}
验证结果
使用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令牌。 它将JSON内容读写为离散事件。 JsonReader和JsonWriter将数据读/写为令牌,称为JsonToken 。
它是处理JSON的三种方法中最强大的方法。 它具有最低的开销,并且在读/写操作中非常快。 它类似于XML的Stax解析器。
在本章中,我们将展示使用GSON流API来读取JSON数据。 Streaming 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
在本章中,我们将讨论数组,集合和泛型的序列化/反序列化。
数组示例
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)
让我们看看阵列序列化/反序列化的实际应用。 在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));
}
}
验证结果
使用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>
例子 (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);
}
}
验证结果
使用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类来存储通用对象的类型。
例子 (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);
}
}
验证结果
使用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
在本章中,我们将解释具有内部类的类的序列化/反序列化。
嵌套的内部类示例
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;
}
}
验证结果
使用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());
例子 (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;
}
}
验证结果
使用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使用其内置适配器执行对象的序列化/反序列化。 它还支持自定义适配器。 我们将讨论如何创建自定义适配器以及如何使用它。
创建自定义适配器
通过扩展TypeAdapter类并将其传递给目标对象的类型来创建自定义适配器。 重写read和write方法以分别执行自定义反序列化和序列化。
class StudentAdapter extends TypeAdapter<Student> {
@Override
public Student read(JsonReader reader) throws IOException {
...
}
@Override
public void write(JsonWriter writer, Student student) throws IOException {
}
}
注册自定义适配器
使用GsonBuilder注册自定义适配器,并使用GsonBuilder创建Gson实例。
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Student.class, new StudentAdapter());
Gson gson = builder.create();
使用适配器
Gson现在将使用自定义适配器将Json文本转换为对象,反之亦然。
String jsonString = "{\"name\":\"Mahesh\", \"rollNo\":1}";
Student student = gson.fromJson(jsonString, Student.class);
System.out.println(student);
jsonString = gson.toJson(student);
System.out.println(jsonString);
例子 (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+ "]";
}
}
验证结果
使用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生成优化的Json内容,忽略NULL值。 但是GsonBuilder使用GsonBuilder.serializeNulls()方法提供了在Json输出中显示NULL值的标志。
GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
Gson gson = builder.create();
没有serializeNulls调用的示例
在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+ "]";
}
}
验证结果
使用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类文件。
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+ "]";
}
}
验证结果
使用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序列化/反序列化。 考虑以下具有版本控制支持的类。 在这个类中,我们最初定义了两个变量rollNo和name以及稍后,我们添加了verified为新变量。 使用@Since,我们已经定义了版本1.0的rollNo和name ,并验证了版本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;
}
}
验证结果
使用javac编译器编译类如下 -
C:\GSON_WORKSPACE>javac GsonTester.java
现在运行GsonTester查看结果 -
C:\GSON_WORKSPACE>java GsonTester
验证输出
{"rollNo":1,"name":"Mahesh Kumar","verified":true}
使用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;
}
}
验证结果
使用javac编译器编译类如下 -
C:\GSON_WORKSPACE>javac GsonTester.java
现在运行GsonTester查看结果 -
C:\GSON_WORKSPACE>java GsonTester
验证输出
{"rollNo":1,"name":"Mahesh Kumar","verified":true,"className":"VI"}
使用@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;
}
}
验证结果
使用javac编译器编译类如下 -
C:\GSON_WORKSPACE>javac GsonTester.java
现在运行GsonTester查看结果 -
C:\GSON_WORKSPACE>java GsonTester
验证输出
{"rollNo":1,"name":"Mahesh Kumar"}