You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Retrofit发送含共享Resource类自定义对象的GSON转换问题

解决方案

步骤1:实现Resource类的自定义序列化/反序列化适配器

由于Resource类存放在导入的jar包中,无法直接修改添加Gson序列化注解,通过自定义适配器实现转换逻辑即可:

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;

// 序列化适配器:将Resource对象转换为Gson可识别的Json结构,发送请求时必须实现
public class ResourceSerializer implements JsonSerializer<Resource> {
    @Override
    public JsonElement serialize(Resource src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        // 以下代码替换为Resource类实际包含的字段和对应get方法即可
        jsonObject.addProperty("id", src.getId());
        jsonObject.addProperty("resourceName", src.getResourceName());
        jsonObject.addProperty("resourceType", src.getResourceType());
        // 如果存在嵌套的自定义字段,用context.serialize方法处理即可
        // jsonObject.add("subField", context.serialize(src.getSubField()));
        return jsonObject;
    }
}

// 反序列化适配器:如果需要解析接口返回的Resource字段再实现,不需要可以省略
public class ResourceDeserializer implements JsonDeserializer<Resource> {
    @Override
    public Resource deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        Resource resource = new Resource();
        // 以下代码替换为Resource类实际包含的字段和对应set方法即可
        resource.setId(jsonObject.get("id").getAsString());
        resource.setResourceName(jsonObject.get("resourceName").getAsString());
        resource.setResourceType(jsonObject.get("resourceType").getAsInt());
        // 嵌套自定义字段同理用context.deserialize处理
        // resource.setSubField(context.deserialize(jsonObject.get("subField"), SubField.class));
        return resource;
    }
}

步骤2:构建注册了适配器的自定义Gson实例

Gson customGson = new GsonBuilder()
        // 注册Resource的序列化适配器
        .registerTypeAdapter(Resource.class, new ResourceSerializer())
        // 需要反序列化Resource的话再添加下面这行
        .registerTypeAdapter(Resource.class, new ResourceDeserializer())
        // 按需添加其他配置,比如序列化null值、统一字段命名策略等
        .serializeNulls()
        .create();

步骤3:将自定义Gson绑定到Retrofit

构建Retrofit实例时,传入自定义的Gson对象到GsonConverterFactory即可:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("你的API服务基础地址")
        // 传入自定义Gson实例
        .addConverterFactory(GsonConverterFactory.create(customGson))
        // 其他原有Retrofit配置保持不变
        .build();

配置完成后原有接口调用逻辑不需要做任何修改,Gson会自动调用自定义适配器完成Resource类的转换。如果后续遇到其他jar包中无法修改的自定义类需要转换,重复上述步骤实现对应适配器并注册到Gson即可。

异常排查提示:如果配置完成后仍转换失败,检查是否开启混淆导致Resource类的字段名被重写,可在混淆规则中添加-keep class Resource类的完整包名路径.** { *; } 避免类和字段被混淆。

内容的提问来源于stack exchange,提问作者Johnny Lam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:06:01