Java Gson 库
Gson 是 Google 提供的一个 Java 库,用于将 Java 对象转换为 JSON 表示(序列化),以及将 JSON 字符串转换为 Java 对象(反序列化)。
Gson 的主要特点包括:
- 简单易用的 API
- 无需在 Java 类中添加注解(但支持注解)
- 高性能
- 支持泛型
- 支持自定义序列化和反序列化
核心类:
Gson
:主类,提供序列化和反序列化方法JsonElement
:JSON 元素的抽象类JsonObject
:JSON 对象表示JsonArray
:JSON 数组表示
为什么使用 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>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
一个简单的例子,将 Java 与 JSON 对象互转:
实例
import com.google.gson.Gson;
public class GsonDemo {
public static void main(String[] args) {
Gson gson = new Gson();
// Java对象转JSON
Person person = new Person("张三", 30);
String json = gson.toJson(person);
System.out.println(json); // 输出: {"name":"张三","age":30}
// JSON转Java对象
Person parsedPerson = gson.fromJson(json, Person.class);
System.out.println(parsedPerson.getName()); // 输出: 张三
}
}
class Person {
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter方法 (Gson需要getter/setter)
public String getName() { return name; }
public int getAge() { return age; }
}
public class GsonDemo {
public static void main(String[] args) {
Gson gson = new Gson();
// Java对象转JSON
Person person = new Person("张三", 30);
String json = gson.toJson(person);
System.out.println(json); // 输出: {"name":"张三","age":30}
// JSON转Java对象
Person parsedPerson = gson.fromJson(json, Person.class);
System.out.println(parsedPerson.getName()); // 输出: 张三
}
}
class Person {
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter方法 (Gson需要getter/setter)
public String getName() { return name; }
public int getAge() { return age; }
}
创建 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}
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()); // 输出: 李四
User user = gson.fromJson(json, User.class);
System.out.println(user.getName()); // 输出: 李四
常用功能
集合处理
实例
// 序列化集合
List<Person> people = Arrays.asList(
new Person("王五", 28),
new Person("赵六", 32)
);
String jsonList = gson.toJson(people);
// 反序列化集合
Type listType = new TypeToken<List<Person>>(){}.getType();
List<Person> parsedPeople = gson.fromJson(jsonList, listType);
List<Person> people = Arrays.asList(
new Person("王五", 28),
new Person("赵六", 32)
);
String jsonList = gson.toJson(people);
// 反序列化集合
Type listType = new TypeToken<List<Person>>(){}.getType();
List<Person> parsedPeople = gson.fromJson(jsonList, listType);
日期处理
实例
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
Date now = new Date();
String dateJson = gson.toJson(now);
Date parsedDate = gson.fromJson(dateJson, Date.class);
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.create();
Date now = new Date();
String dateJson = gson.toJson(now);
Date parsedDate = gson.fromJson(dateJson, Date.class);
树模型处理
实例
String json = "{\"name\":\"李四\",\"age\":25}";
JsonElement element = JsonParser.parseString(json);
JsonObject object = element.getAsJsonObject();
String name = object.get("name").getAsString();
int age = object.get("age").getAsInt();
JsonElement element = JsonParser.parseString(json);
JsonObject object = element.getAsJsonObject();
String name = object.get("name").getAsString();
int age = object.get("age").getAsInt();
常用配置
美化输出
Gson gson = new GsonBuilder() .setPrettyPrinting() .create();
空值处理
Gson gson = new GsonBuilder() .serializeNulls() // 序列化null值 .create();
字段命名策略
Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create(); // 会将userName转换为user_name
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);
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);
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();
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;
}
@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();
.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 等其他库。