![](/img/trans.png)
[英]Deserializing json that is false or object with Retrofit GsonConverterFactory
[英]Can not convert Subclass object to request body json in Retrofit 2.0 with GsonConverterFactory
在我的情況下,當我將子類對象放入改裝請求時,它在請求體中變為空白
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與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()));
感謝@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
或任何根類/接口,因此它會自動處理所有可能的子類,因為更復雜的層次結構被添加到項目中 - 雖然不確定此類通用方法的任何缺點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.