Gson 使用详解
Gson 是 Google 提供的 Java 库,用于 JSON 和 Java 对象之间的相互转换。它提供了简单的 API,可以轻松实现:
- Java 对象 → JSON 字符串(序列化)
- JSON 字符串 → Java 对象(反序列化)
1. 基本用法
(1)添加 Gson 依赖
Maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
Gradle
implementation 'com.google.code.gson:gson:2.10.1'
(2)基本转换示例
① Java 对象 → JSON(序列化)
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
// 创建 Java 对象
Person person = new Person("张三", 25);
// 使用 Gson 转换为 JSON
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println(json);
// 输出: {"name":"张三","age":25}
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
② JSON → Java 对象(反序列化)
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"李四\",\"age\":30}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person.getName()); // 输出: 李四
System.out.println(person.getAge()); // 输出: 30
}
}
class Person {
private String name;
private int age;
// 必须有无参构造方法或匹配的构造方法
public Person() {}
public String getName() { return name; }
public int getAge() { return age; }
}
2. 进阶用法
(1)处理复杂对象(嵌套、List、Map)
① 嵌套对象
class Address {
private String city;
private String street;
// getters & setters
}
class User {
private String name;
private Address address;
// getters & setters
}
// 转换示例
User user = new User();
user.setName("Alice");
user.setAddress(new Address("北京", "长安街"));
Gson gson = new Gson();
String json = gson.toJson(user);
// 输出: {"name":"Alice","address":{"city":"北京","street":"长安街"}}
② 处理 List 和 Map
List<String> hobbies = Arrays.asList("篮球", "音乐", "编程");
Map<String, Integer> scores = Map.of("数学", 90, "英语", 85);
Gson gson = new Gson();
String jsonList = gson.toJson(hobbies);
// 输出: ["篮球","音乐","编程"]
String jsonMap = gson.toJson(scores);
// 输出: {"数学":90,"英语":85}
(2)自定义序列化和反序列化
① 使用 JsonSerializer 和 JsonDeserializer
import com.google.gson.*;
public class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Override
public JsonElement serialize(Date date, Type type, JsonSerializationContext context) {
return new JsonPrimitive(format.format(date));
}
@Override
public Date deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
try {
return format.parse(json.getAsString());
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
// 使用方式
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateAdapter())
.create();
Date now = new Date();
String json = gson.toJson(now); // "2023-10-01"
Date parsedDate = gson.fromJson("\"2023-10-01\"", Date.class);
② 使用 @SerializedName 注解(字段名映射)
class User {
@SerializedName("user_name") // JSON 字段名是 "user_name"
private String name;
@SerializedName("user_age")
private int age;
}
// JSON: {"user_name":"张三","user_age":25}
// 会被映射到 User 对象的 name 和 age 字段
(3)格式化 JSON(美化输出)
Gson gson = new GsonBuilder()
.setPrettyPrinting() // 美化输出
.create();
String json = gson.toJson(user);
System.out.println(json);
输出:
{
"name": "张三",
"age": 25,
"address": {
"city": "北京",
"street": "长安街"
}
}
3. 常见问题
(1)Gson 和 FastJson 对比
| 特性 | Gson | FastJson |
|---|---|---|
| 开发者 | 阿里巴巴 | |
| 性能 | 中等 | 更快 |
| 安全性 | 高 | 曾曝出漏洞 |
| 易用性 | 简单 | 更灵活 |
| 社区支持 | 广泛 | 国内流行 |
(2)Gson 处理特殊数据类型
null值:默认会被忽略,可用.serializeNulls()强制输出:Gson gson = new GsonBuilder().serializeNulls().create();- 枚举(Enum):默认使用
name()方法,可自定义适配器。
4. 总结
- 基本转换:
toJson()和fromJson()。 - 复杂对象:支持嵌套、
List、Map。 - 自定义适配器:
JsonSerializer和JsonDeserializer。 - 注解支持:
@SerializedName用于字段映射。 - 格式化:
setPrettyPrinting()让 JSON 更易读。
2955

被折叠的 条评论
为什么被折叠?



