java - 无法使用 GsonConverterFactory 在 Retrofit 2.0 中将子类对象转换为请求正文 json

标签 java android gson rx-java retrofit2

在我的例子中,当我将子类对象放入改造请求中时,它在请求正文中变为空白

interface User{ // my super interface
} 

class FbUser implements User{  // my sub class
   public String name;
   public String email;
}

interface APIInterface{
    @POST(APIConstants.LOGIN_URL)
    Observable<LoginAPIResponse> createUserNew(@Body User user);
}



Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                .addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
                .client(okHttpClient)
                .build();

    APIInterface    networkAPI = retrofit.create(APIInterface.class);

现在我正在传递 FbUserObject

networkAPI.createUserNew(fbUserObject).subscribe();

然后对象在主体中变为空白。 查看我的日志

 D/OkHttp: Content-Type: application/json; charset=UTF-8
D/OkHttp: Content-Length: 2
D/OkHttp: Accept: application/json
D/OkHttp: TT-Mobile-Post: post
D/OkHttp: {}
D/OkHttp: --> END POST (2-byte body)

我还浏览了这个 stackover 流程​​链接 Polymorphism with gson

我必须自己编写 Gson 转换器吗?

最佳答案

Gson 尝试序列化没有字段的 User 类。

你需要做的是将类型适配器注册到gson:

    retrofitBuilder.addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
            .registerTypeAdapter(User.class, new JsonSerializer<User>() {
                @Override
                public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
                    if (src instanceof FbUser ) {
                        return context.serialize(src, FbUser.class);
                    }
                    return context.serialize(src);
                }
            }).create()));

关于java - 无法使用 GsonConverterFactory 在 Retrofit 2.0 中将子类对象转换为请求正文 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37589236/

相关文章:

java - Runtime.exec 进程的生命周期

java - MQ 队列管理器在连接期间立即关闭 channel

json - Gson - 使用嵌套映射反序列化 json

java - 如何将具有复合键的键值结构映射到 Java 中的 json 对象

java - Spring JPA Repository - 单独的插入和更新方法

java - 在虚拟机上导出rmi

Android:从 XML 项中获取属性值

android - Nearby Places 搜索给出随机结果而不是特定结果

android - 适用于 Android 的 OpenGL ES 工具

java - 使用 Gson 读取 JSON 字符串