2016-06-02 2 views
5

В моем случае, когда я помещал вспомогательный объект класса в запросе дооснащения он становится пустым в теле запросаНевозможно преобразовать Подкласс объект запроса JSON тела в Модернизированный 2.0 с 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 with gson

Если я должен написать свой собственный Gson конвертер?

ответ

3

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())); 
+1

Похоже на решение проблемы. Теперь я печальная панда: (Ищете способ автоматизировать процесс. Возможно, отражением является мой выбор –

0

Благодаря @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 или любой другой корневой класс/интерфейс настолько он обрабатывает все возможные подклассы автоматически более сложные иерархии добавляются в проект - не уверен в любые недостатки такого общего подхода в настоящий момент.

Смежные вопросы