簡體   English   中英

無法將Subclass對象轉換為使用GsonConverterFactory在Retrofit 2.0中請求body json

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM