Gson是一个流行的 Java 库,用于将 Java 对象序列化为 JSON 字符串,以及将 JSON 字符串反序列化为 Java 对象。以下是一些 Gson 类的常用方法及其详解和代码案例:
1. 创建 Gson 实例
有两种方式创建 Gson 实例:
new Gson()
:创建一个默认的 Gson 实例。new GsonBuilder().create()
:创建一个 GsonBuilder 实例,可以设置各种配置,如格式化输出、序列化空值等。
2. 序列化(Java对象 --> JSON)
toJson(Object src)
:将对象序列化为 JSON 字符串。toJson(Object src, Type srcType)
:将指定类型的 Java 对象序列化为 JSON 字符串。
代码案例:
java
Gson gson = new Gson();
Employee emp = new Employee(1001, "Lokesh", "Gupta", "howtodoinjava@gmail.com");
String jsonString = gson.toJson(emp);
System.out.println(jsonString);
输出结果:
java
{"id":1001,"firstName":"Lokesh","lastName":"Gupta","email":"howtodoinjava@gmail.com"}
3. 反序列化(JSON --> Java对象)
fromJson(String json, Class<T> classOfT)
:将 JSON 字符串反序列化为指定类型的 Java 对象。fromJson(String json, Type typeOfT)
:将 JSON 字符串反序列化为指定类型的 Java 对象。
代码案例:
java
String json = "{\"id\":1001,\"firstName\":\"Lokesh\",\"lastName\":\"Gupta\",\"email\":\"howtodoinjava@gmail.com\"}";
Gson gson = new Gson();
Employee emp = gson.fromJson(json, Employee.class);
System.out.println(emp);
4. 处理空值
Gson 默认不会序列化值为 null
的字段。如果需要序列化 null
值,可以使用 GsonBuilder
的 serializeNulls()
方法。
代码案例:
java
Gson gson = new GsonBuilder().serializeNulls().create();
Employee emp = new Employee(1001, null, "Gupta", null);
String jsonString = gson.toJson(emp);
System.out.println(jsonString);
输出结果:
java
{"id":1001,"lastName":"Gupta"}
5. 格式化输出
使用 GsonBuilder
的 setPrettyPrinting()
方法可以生成格式化的 JSON 输出。
代码案例:
java
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(emp);
System.out.println(jsonString);
6. 排除字段
可以使用 **transient
关键字或@Expose
**注解来排除字段的序列化和反序列化。
在 Java 编程语言中,transient
是一个关键字,用于修饰类的成员变量。当成员变量被声明为 transient
时,它不会被序列化和反序列化。在 JSON 序列化和反序列化的上下文中,这意味着该字段不会被包含在生成的 JSON 字符串中,也不会从 JSON 字符串中被反序列化回对象。
在中文中,transient
可以翻译为"短暂的"、"临时的"或"瞬时的"。在计算机科学和编程的上下文中,它通常被翻译为"瞬时的"或"非持久的",以表示该变量的值在序列化过程中是不被保留的。
代码案例 (使用 transient
):
java
class Employee {
private int id;
private String firstName;
private transient String lastName;
// getters and setters
}
7. 自定义序列化和反序列化
实现 JsonSerializer
和 JsonDeserializer
接口来提供自定义的序列化和反序列化逻辑。
8. 处理循环依赖
Gson 不支持循环依赖对象的序列化。可以通过解除循环依赖或使用 transient
关键字修饰有循环依赖的字段来解决这个问题。
代码案例(解除循环依赖):
java
public class A {
private String name;
// 使用 transient 关键字修饰有循环依赖的字段
private transient B b;
// 构造方法、getters 和 setters
}
public class B {
private A a;
public B(A a) {
this.a = a;
}
// getters 和 setters
}