本文将介绍一些使用 Gson 库进行对象序列化时需要注意的细节,帮助开发人员更好地理解和应用该库。

引入Gson库

首先,需要确保项目中已经正确引入了 Gson 库。可以通过 Maven、Gradle 或手动下载 jar 包的方式导入 Gson 库。

例如,如果使用 Maven,在 pom.xml 文件中添加以下依赖项:

1
2
3
4
5
6
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
<scope>compile</scope>
</dependency>

创建Gson对象

在使用 Gson 库之前,需要创建一个 Gson 对象。可以直接使用默认的 Gson 构造函数创建一个 Gson 对象,也可以根据需要配置一些参数。

例如,如果希望将 JSON 字符串格式化输出,可以使用 Gson 对象的 setPrettyPrinting 方法:

1
2
3
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();

序列化对象

要将 Java 对象序列化为 JSON 格式,只需要调用 Gson 对象的 toJson 方法,并传入待序列化的 Java 对象即可。Gson 库会根据对象的字段和其对应的 getter 方法自动将其转换为 JSON 格式。

BagOfPrimitives 实体类为例,其定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.johnson.gson;

/**
* @author johnson lin
* @date 2023/8/1 07:41
*/
public class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;

BagOfPrimitives() {
// no-args constructor
}

public int getValue1() {
return value1;
}

public void setValue1(int value1) {
this.value1 = value1;
}

public String getValue2() {
return value2;
}

public void setValue2(String value2) {
this.value2 = value2;
}

public int getValue3() {
return value3;
}

public void setValue3(int value3) {
this.value3 = value3;
}
}

初始化 BagOfPrimitives 对象,并使用 Gson 进行序列化,最后在控制台进行打印输出:

1
2
3
4
BagOfPrimitives obj = new BagOfPrimitives();
String json = gson.toJson(obj);

System.out.println(json);

输出打印结果如下:

1
2
3
4
{
"value1": 1,
"value2": "abc"
}

完整的 main() 函数代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.johnson.gson;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
* @author johnson lin
* @date 2023/8/1 07:46
*/
public class ObjectExample02 {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();

BagOfPrimitives obj = new BagOfPrimitives();
String json = gson.toJson(obj);

System.out.println(json);
}
}
/*
此代码示例执行结果如下:

{
"value1": 1,
"value2": "abc"
}

*/

请注意,不能序列化具有循环引用的对象,因为这会导致无限递归。

反序列化对象

要将 JSON 字符串反序列化为 Java 对象,只需调用 Gson 对象的 fromJson 方法,并传入待反序列化的 JSON 字符串和目标 Java 对象的类类型。

例如,对上一个示例中获取的 JSON 字符串进行反序列化:

1
2
// 反序列化,obj2与obj非常类似
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);

关于对象的一些细节

  • 在使用私有字段方面是完全可以的(且建议如此)。
  • 没有必要使用任何注解来指示一个字段需要被包括在序列化和反序列化中。所有当前类及其父类的字段默认都会被包括进去。
  • 如果一个字段被标记为 transient,默认情况它会被忽略,不会包括在 JSON 序列化或反序列化中。
  • Gson 的实现可正确处理 null 字段:
    • 在序列化时,如果一个字段为空值(null),则不会包括在输出结果中。
    • 在反序列化时,如果 JSON 中缺少某个字段,则会将对象中对应的字段设置为其默认值:对象类型为 null,数值类型为 0,布尔类型为 false。
  • 如果一个字段是合成的(synthetic),则会被忽略,不会包含在 JSON 序列化或反序列化中。
  • 内部类中对应外部类的字段会被忽略,也不会包括在序列化或反序列化中。
  • 匿名类和局部类会被排除在外。它们会被序列化为 JSON 的 null,在反序列化时它们的 JSON 值会被忽略,返回 null。将这些类转换为静态嵌套类(static)可以使它们能够进行序列化和反序列化。

(END)