在Android开发中,和服务端进行数据交互时,服务端通常会返回JSON格式的数据,我们需要将这些数据转换成对应的Java对象方便后续使用。Gson是Google推出的轻量级JSON解析库,能够自动完成JSON字符串和Java对象之间的映射,相比原生JSON解析方式代码更简洁,出错概率更低。

Gson的集成方式
使用Gson首先需要将其引入到Android项目中,在项目的build.gradle文件的dependencies中添加依赖即可,具体添加内容如下:
dependencies {
implementation 'com.google.code.gson:gson:2.10.1'
}添加完成后同步项目,就可以在代码中使用Gson的相关功能了。
基础JSON解析示例
假设服务端返回的JSON数据是一个用户对象,结构如下:
{
"name": "张三",
"age": 25,
"is_vip": true
}首先我们需要创建一个对应的Java实体类,成员变量名需要和JSON中的key保持一致,如果不一致可以通过注解映射,实体类代码如下:
public class User {
private String name;
private int age;
// JSON中的key是is_vip,通过SerializedName注解映射到成员变量isVip
@SerializedName("is_vip")
private boolean isVip;
// 必须提供无参构造方法,Gson反射创建对象时需要
public User() {
}
// getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isVip() {
return isVip;
}
public void setVip(boolean vip) {
isVip = vip;
}
}接下来使用Gson将上述JSON字符串解析成User对象,代码如下:
// 创建Gson实例
Gson gson = new Gson();
// JSON字符串
String jsonStr = "{\"name\": \"张三\", \"age\": 25, \"is_vip\": true}";
// 解析成User对象
User user = gson.fromJson(jsonStr, User.class);
// 输出解析结果
System.out.println("姓名:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("是否VIP:" + user.isVip());解析JSON数组
如果服务端返回的是JSON数组格式的数据,比如多个用户的信息:
[
{"name": "张三", "age": 25, "is_vip": true},
{"name": "李四", "age": 30, "is_vip": false}
]解析数组需要使用TypeToken来获取泛型类型,代码如下:
Gson gson = new Gson();
String jsonArrayStr = "[{\"name\": \"张三\", \"age\": 25, \"is_vip\": true}, {\"name\": \"李四\", \"age\": 30, \"is_vip\": false}]";
// 通过TypeToken获取List<User>的类型
Type type = new TypeToken<List<User>>(){}.getType();
List<User> userList = gson.fromJson(jsonArrayStr, type);
// 遍历解析结果
for (User u : userList) {
System.out.println("姓名:" + u.getName() + ",年龄:" + u.getAge());
}自定义解析规则
有时候JSON中的日期格式或者特殊字段需要自定义解析逻辑,Gson支持通过自定义JsonDeserializer来实现。比如JSON中的日期是时间戳格式,我们需要转换成Date对象:
// 自定义日期反序列化器
class DateDeserializer implements JsonDeserializer<Date> {
@Override
public Date deserialize(JsonElement json, java.lang.reflect.Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
// 时间戳是长整型,直接转换
long timestamp = json.getAsLong();
return new Date(timestamp);
}
}
// 创建Gson时注册自定义解析器
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateDeserializer())
.create();
// 测试JSON,date是时间戳
String jsonWithDate = "{\"name\": \"张三\", \"create_time\": 1698765432000}";
class Order {
private String name;
@SerializedName("create_time")
private Date createTime;
public Order() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
Order order = gson.fromJson(jsonWithDate, Order.class);
System.out.println("订单名:" + order.getName() + ",创建时间:" + order.getCreateTime());Java对象转JSON字符串
Gson不仅可以将JSON转成Java对象,也可以将Java对象转成JSON字符串,使用toJson方法即可:
Gson gson = new Gson();
User user = new User();
user.setName("王五");
user.setAge(28);
user.setVip(true);
// 转成JSON字符串
String json = gson.toJson(user);
System.out.println(json);注意事项
- 实体类必须提供无参构造方法,否则Gson反射创建对象时会抛出异常。
- 如果JSON中的key和实体类成员变量名不一致,需要使用
@SerializedName注解指定映射的key。 - 解析时如果JSON中缺少某个字段,对应成员变量会使用默认值,不会报错。
- 如果JSON中多余的字段没有对应的成员变量,Gson默认会忽略,不会抛出异常。
GsonAndroidJSON解析json_to_java修改时间:2026-06-06 14:34:26