Gson 类(将 Java 对象序列化为 JSON 字符串,以及将 JSON 字符串反序列化为 Java 对象)

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 值,可以使用 GsonBuilderserializeNulls() 方法。

代码案例

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. 格式化输出

使用 GsonBuildersetPrettyPrinting() 方法可以生成格式化的 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. 自定义序列化和反序列化

实现 JsonSerializerJsonDeserializer 接口来提供自定义的序列化和反序列化逻辑。

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
}
相关推荐
吃西瓜的年年8 分钟前
1. 初识C语言
c语言·开发语言
南部余额12 分钟前
踩坑与解惑:深入理解 SpringBoot 自动配置原理与配置排除机制
java·spring boot·自动配置原理·import
CHANG_THE_WORLD35 分钟前
Python 字符串全面解析
开发语言·python
不会c嘎嘎44 分钟前
深入理解 C++ 异常机制:从原理到工程实践
开发语言·c++
永远都不秃头的程序员(互关)1 小时前
C语言 基本语法
c语言·开发语言
木鹅.1 小时前
LangChain4j
java
永远都不秃头的程序员(互关)2 小时前
Java核心技术精要:高效实践指南
java·开发语言·性能优化
是Dream呀2 小时前
Python圣诞特辑:打造一棵会唱歌、会下雪的魔法圣诞树
开发语言·python·pygame
未来之窗软件服务2 小时前
幽冥大陆(四十一)美萍V10酒店门锁SDK C#语言仙盟插件——东方仙盟筑基期
开发语言·c#·仙盟创梦ide·东方仙盟·东方仙盟sdk·酒店智能门锁·东方仙盟 vos 智能浏览器
CoderYanger2 小时前
动态规划算法-子序列问题(数组中不连续的一段):28.摆动序列
java·算法·leetcode·动态规划·1024程序员节