2016-06-02 25 views
5

Trong trường hợp của tôi khi tôi đặt đối tượng lớp phụ trong yêu cầu trang bị thêm nó trở nên trống rỗng trong yêu cầu cơ thểKhông thể chuyển đổi đối tượng Subclass để yêu cầu cơ thể json theo Retrofit 2.0 với 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); 

bây giờ tôi đang đi qua FbUserObject

networkAPI.createUserNew(fbUserObject).subscribe(); 

thì đối tượng sẽ trống trong phần thân. thấy đăng nhập của tôi

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) 

tôi cũng trải qua liên kết này dòng chảy stackover Polymorphism with gson

i nên phải viết riêng Gson Chuyển đổi của tôi?

Trả lời

3

Gson cố gắng sắp xếp lớp học User mà không có trường.

Những gì bạn cần làm là đăng ký loại adapter để 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

Trông giống như một giải pháp. Tôi là một con gấu trúc buồn bây giờ mặc dù: (Tìm kiếm một cách để tự động hóa quá trình. Có lẽ phản ánh là sự lựa chọn của tôi –

0

Nhờ @pixel cho câu trả lời của mình - nó giúp để thâm nhập vào đúng hướng vì vậy tôi đã nảy ra giải pháp chung chung hơn và bây giờ tôi đang hạnh phúc một lần nữa:

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

tôi nghĩ một thậm chí có thể sử dụng Object thay vì User hoặc bất cứ lớp root/giao diện là để nó xử lý tất cả các lớp con có thể tự động như hệ thống phân cấp phức tạp hơn được thêm vào dự án - không chắc về bất kỳ hạn chế nào của cách tiếp cận chung như vậy vào lúc này.

Các vấn đề liên quan