在使用GsonConverterFactory进行改装2.0时,无法将Subclass对象转换为请求主体json



在我的情况下,当我在改装请求中放入子类对象时,它在请求主体中变为空白

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)

我还用gson 研究了stackover流链多态性

我应该写我自己的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()));

感谢@pixel的回答-它帮助我找到了正确的方向,所以我提出了更通用的解决方案,现在我又很高兴了:

Gson gson = new GsonBuilder()
.registerTypeAdapter(User.class, new JsonSerializer<User>() {
@Override
public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
return context.serialize(src, src.getClass());
}
})
.create();

我认为人们甚至可以使用Object而不是User,或者根类/接口是什么,这样它就可以在项目中添加更复杂的层次结构时自动处理所有可能的子类——不过,目前还不确定这种通用方法的任何缺点。

最新更新