📜  在 Android 中使用 GSON 库对 JSON 进行序列化和反序列化(1)

📅  最后修改于: 2023-12-03 15:07:36.960000             🧑  作者: Mango

在 Android 中使用 GSON 库对 JSON 进行序列化和反序列化

GSON 是 Google 提供的一个开源的 Java 库,用于将 Java 对象序列化为 JSON 字符串,或将 JSON 字符串反序列化为 Java 对象。

使用前准备
  1. 在项目的 build.gradle 文件中添加以下依赖:

    implementation 'com.google.code.gson:gson:2.8.6'
    
  2. 创建需要序列化或反序列化的 Java 类,其中考虑到字段名与 JSON 字段名不一致的情况,需要在字段上使用 @SerializedName 注解来指定 JSON 字段名。例如:

    public class User {
        @SerializedName("name")
        private String userName;
    
        @SerializedName("age")
        private int userAge;
    
        // ... 省略其他字段
    
        // ... 省略构造方法和 getter/setter 方法
    }
    
序列化

将 Java 对象序列化为 JSON 字符串,可以使用 GSON 提供的 Gson 类。例如:

User user = new User("Tom", 20, /*...*/);
Gson gson = new Gson();
String jsonStr = gson.toJson(user);

上述代码会将 user 对象序列化为一个 JSON 字符串。

反序列化

将 JSON 字符串反序列化为 Java 对象,也可以使用 Gson 类。例如:

String jsonStr = "{\"name\":\"Tom\", \"age\": 20, /*...*/ }"; // 一个 JSON 字符串
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);

上述代码会将 jsonStr 字符串反序列化为一个 User 对象。

序列化和反序列化全局配置

对于一些字段名都符合命名规范的 Java 类,可以使用 GSON 的自动命名策略来简化开发。例如:

Gson gson = new GsonBuilder()
        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) // 自动将 Java 字段名转为下划线命名的 JSON 字段名
        .create();

而如果 Java 类中有一些字段需要特殊的序列化或反序列化逻辑(例如日期格式化、特定类型的处理等),可以使用 GSON 的自定义 TypeAdapter 来实现。例如:

public class DateTypeAdapter extends TypeAdapter<Date> {
    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        out.value(String.valueOf(value.getTime() / 1000)); // 将日期转为时间戳
    }
  
    @Override
    public Date read(JsonReader in) throws IOException {
        long timestamp = in.nextLong(); // 从时间戳转为日期
        return new Date(timestamp * 1000);
    }
}

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new DateTypeAdapter()) // 注册自定义 TypeAdapter
        .create();
参考资料