android/java中gson的用法

GSON 是 Google 提供的用于在 Java 对象和 JSON 数据之间进行序列化和反序列化的库。

1. 添加依赖

build.gradle 中添加:

gradle 复制代码
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

2. 基本用法

创建 Gson 实例

java 复制代码
Gson gson = new Gson();

简单对象序列化和反序列化

java 复制代码
// 序列化:对象 → JSON
User user = new User("John", 25, "john@example.com");
String json = gson.toJson(user);
// 结果: {"name":"John","age":25,"email":"john@example.com"}

// 反序列化:JSON → 对象
String jsonString = "{\"name\":\"John\",\"age\":25,\"email\":\"john@example.com\"}";
User user = gson.fromJson(jsonString, User.class);

3. 复杂对象处理

处理集合

java 复制代码
// List 序列化
List<User> users = Arrays.asList(
    new User("Alice", 30, "alice@example.com"),
    new User("Bob", 28, "bob@example.com")
);
String json = gson.toJson(users);

// List 反序列化
String jsonArray = "[{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},{\"name\":\"Bob\",\"age\":28,\"email\":\"bob@example.com\"}]";
User[] userArray = gson.fromJson(jsonArray, User[].class);
List<User> userList = gson.fromJson(jsonArray, new TypeToken<List<User>>(){}.getType());

处理 Map

java 复制代码
// Map 序列化
Map<String, Object> data = new HashMap<>();
data.put("name", "John");
data.put("scores", Arrays.asList(90, 85, 92));
String json = gson.toJson(data);

// Map 反序列化
String jsonMap = "{\"math\":90,\"english\":85,\"science\":92}";
Map<String, Integer> scores = gson.fromJson(jsonMap, new TypeToken<Map<String, Integer>>(){}.getType());

4. 自定义序列化/反序列化

使用 @SerializedName 注解

java 复制代码
public class User {
    @SerializedName("user_name")
    private String name;
    
    @SerializedName("user_age")
    private int age;
    
    private String email;
    
    // 构造方法、getter、setter
}

自定义序列化器

java 复制代码
public class DateSerializer implements JsonSerializer<Date> {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    @Override
    public JsonElement serialize(Date date, Type type, JsonSerializationContext context) {
        return new JsonPrimitive(dateFormat.format(date));
    }
}

public class DateDeserializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
        try {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(json.getAsString());
        } catch (ParseException e) {
            throw new JsonParseException(e);
        }
    }
}

使用自定义序列化器

java 复制代码
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Date.class, new DateSerializer())
    .registerTypeAdapter(Date.class, new DateDeserializer())
    .create();

5. GsonBuilder 配置

java 复制代码
Gson gson = new GsonBuilder()
    .setPrettyPrinting()                    // 美化输出
    .serializeNulls()                       // 序列化 null 值
    .setDateFormat("yyyy-MM-dd")           // 设置日期格式
    .disableHtmlEscaping()                 // 禁用 HTML 转义
    .excludeFieldsWithoutExposeAnnotation() // 只序列化有 @Expose 注解的字段
    .create();

@Expose 注解使用

java 复制代码
public class User {
    @Expose
    private String name;
    
    @Expose(serialize = false, deserialize = true) // 只反序列化,不序列化
    private String password;
    
    private String secret; // 不会被序列化或反序列化
}

6. 实际应用示例

网络请求数据解析

java 复制代码
public class ApiResponse {
    private int code;
    private String message;
    private User data;
    
    // getter, setter
}

// 解析网络响应
String responseJson = "{\"code\":200,\"message\":\"success\",\"data\":{\"name\":\"John\",\"age\":25}}";
ApiResponse apiResponse = gson.fromJson(responseJson, ApiResponse.class);

配置数据存储

java 复制代码
// 保存配置到 SharedPreferences
public void saveConfig(Context context, Config config) {
    SharedPreferences prefs = context.getSharedPreferences("config", Context.MODE_PRIVATE);
    String json = gson.toJson(config);
    prefs.edit().putString("config", json).apply();
}

// 从 SharedPreferences 读取配置
public Config loadConfig(Context context) {
    SharedPreferences prefs = context.getSharedPreferences("config", Context.MODE_PRIVATE);
    String json = prefs.getString("config", "");
    if (!json.isEmpty()) {
        return gson.fromJson(json, Config.class);
    }
    return null;
}

7. 处理特殊场景

忽略字段

java 复制代码
public class User {
    private String name;
    private int age;
    
    @Exclude
    private transient String temporaryData; // 使用 transient 关键字
    
    // 使用 @Exclude 注解(需要配合 excludeFieldsWithoutExposeAnnotation)
}

处理多态类型

java 复制代码
public abstract class Animal {
    String type;
}

public class Dog extends Animal {
    String breed;
}

public class Cat extends Animal {
    boolean likesCatnip;
}

// 使用 RuntimeTypeAdapterFactory
RuntimeTypeAdapterFactory<Animal> adapterFactory = RuntimeTypeAdapterFactory
    .of(Animal.class, "type")
    .registerSubtype(Dog.class, "dog")
    .registerSubtype(Cat.class, "cat");

Gson gson = new GsonBuilder()
    .registerTypeAdapterFactory(adapterFactory)
    .create();

8. 最佳实践

  1. 重用 Gson 实例:Gson 是线程安全的,建议重用实例
  2. 处理异常:始终处理 JsonSyntaxException
  3. 性能考虑:对于大量数据,考虑使用流式 API
  4. 安全考虑:不要反序列化不可信的 JSON 数据
java 复制代码
try {
    User user = gson.fromJson(jsonString, User.class);
} catch (JsonSyntaxException e) {
    // 处理 JSON 语法错误
    e.printStackTrace();
}
相关推荐
Goldn.20 分钟前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
李慕婉学姐1 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
小鸡吃米…1 小时前
Python 列表
开发语言·python
m0_740043731 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖2 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
kaikaile19952 小时前
基于C#实现一维码和二维码打印程序
开发语言·c#
我不是程序猿儿2 小时前
【C#】画图控件的FormsPlot中的Refresh功能调用消耗时间不一致缘由
开发语言·c#
未若君雅裁2 小时前
JVM面试篇总结
java·jvm·面试
rit84324992 小时前
C# Socket 聊天室(含文件传输)
服务器·开发语言·c#
kk哥88992 小时前
C++ 对象 核心介绍
java·jvm·c++