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
相关产品推荐
相关产品推荐

