Java Gson 库

Gson 是 Google 提供的一个 Java 库,用于将 Java 对象转换为 JSON 表示(序列化),以及将 JSON 字符串转换为 Java 对象(反序列化)。它是 Java 开发中最流行的 JSON 处理库之一。

Gson 的主要特点包括:

  • 简单易用的 API
  • 无需在 Java 类中添加注解(但支持注解)
  • 高性能
  • 支持泛型
  • 支持自定义序列化和反序列化

为什么使用 Gson?

在 Java 开发中,我们经常需要在以下场景处理 JSON 数据:

  • 与 RESTful API 交互
  • 配置文件读写
  • 数据持久化
  • 不同系统间的数据交换

Gson 提供了简单高效的方式来完成这些任务,相比 Java 原生的 JSON 处理方式更加便捷。


Gson 的基本用法

添加 Gson 依赖

首先需要在项目中添加 Gson 依赖。如果你使用 Maven,可以在 pom.xml 中添加:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

创建 Gson 实例

Gson gson = new Gson();

Java 对象转 JSON(序列化)

实例

class User {
    private String name;
    private int age;
   
    // 构造函数、getter 和 setter 省略
}

User user = new User("张三", 25);
String json = gson.toJson(user);
// 输出: {"name":"张三","age":25}

JSON 转 Java 对象(反序列化)

实例

String json = "{\"name\":\"李四\",\"age\":30}";
User user = gson.fromJson(json, User.class);
System.out.println(user.getName()); // 输出: 李四

Gson 的高级特性

处理复杂对象

Gson 可以处理包含嵌套对象、数组、集合等复杂数据结构:

实例

class Order {
    private String orderId;
    private List<Product> products;
    // 省略其他代码
}

Order order = new Order("123", Arrays.asList(
    new Product("手机", 1, 2999.00),
    new Product("耳机", 2, 199.00)
));

String json = gson.toJson(order);

使用 TypeToken 处理泛型

当需要处理泛型集合时,可以使用 TypeToken:

实例

String json = "[{\"name\":\"苹果\",\"price\":5.5},{\"name\":\"香蕉\",\"price\":3.2}]";

Type productListType = new TypeToken<List<Product>>(){}.getType();
List<Product> products = gson.fromJson(json, productListType);

自定义序列化和反序列化

你可以通过实现 JsonSerializer 和 JsonDeserializer 接口来自定义处理逻辑:

实例

public class DateSerializer implements JsonSerializer<Date> {
    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
   
    @Override
    public JsonElement serialize(Date date, Type type, JsonSerializationContext context) {
        return new JsonPrimitive(format.format(date));
    }
}

// 使用自定义序列化器
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Date.class, new DateSerializer())
    .create();

使用注解

Gson 提供了一些有用的注解:

实例

class User {
    @SerializedName("user_name")  // JSON 字段名
    private String name;
   
    @Expose(serialize = false)   // 不参与序列化
    private String password;
   
    @Since(1.0)                  // 版本控制
    private String email;
}

GsonBuilder 配置

GsonBuilder 提供了多种配置选项:

实例

Gson gson = new GsonBuilder()
    .setPrettyPrinting()         // 美化输出
    .serializeNulls()           // 序列化 null 值
    .setDateFormat("yyyy-MM-dd") // 日期格式
    .disableHtmlEscaping()       // 禁用 HTML 转义
    .create();

性能考虑

  • 重用 Gson 实例:Gson 是线程安全的,建议重用而不是频繁创建
  • 对于大量数据处理,考虑使用流式 API(JsonReader/JsonWriter)
  • 复杂对象结构会影响性能

Gson 与其他 JSON 库的比较

特性 Gson Jackson org.json
易用性
性能
功能完整性 非常高
社区支持 非常高

总结

Gson 是一个强大而简单的 JSON 处理库,适合大多数 Java 项目。它提供了:

  • 简单的 API 设计
  • 灵活的配置选项
  • 良好的性能
  • 丰富的功能

对于简单的 JSON 处理需求,Gson 通常是 Java 开发者的首选。对于高性能需求或复杂场景,可以考虑 Jackson 等其他库。