2016-06-02 3 views
5

साथ रेट्रोफिट 2.0 में शरीर json अनुरोध करने के लिए मेरे मामले में जब मैं पुराना वापस अनुरोध में उप वर्ग वस्तु डाल उपवर्ग वस्तु कनवर्ट नहीं कर सकता यह अनुरोध शरीर में खाली हो जाता है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

जीसन कक्षा 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 या उपयोग कर सकते हैं जो कुछ भी जड़ वर्ग/इंटरफेस इतनी के रूप में और अधिक जटिल पदानुक्रम परियोजना से जुड़ जाते हैं तो वह अपने आप हर संभव उपवर्गों संभालती है - के बारे में निश्चित नहीं है हालांकि इस समय इस तरह के एक सामान्य दृष्टिकोण की कोई कमी।