मैं एक सरल enum है:रेट्रोफिट के माध्यम से @Query में कस्टम enum कैसे पास करें?
public enum Season {
@SerializedName("0")
AUTUMN,
@SerializedName("1")
SPRING;
}
कुछ संस्करण शुरू, GSON ऐसे enums पार्स करने में सक्षम हो गया। यह सुनिश्चित करने के लिए, मैंने यह किया:
final String s = gson.toJson(Season.AUTUMN);
यह मेरी अपेक्षा के अनुसार काम करता है। आउटपुट "0"
है। तो, मैं अपने रेट्रोफिट सेवाओं में इसका इस्तेमाल करने की कोशिश की:
@GET("index.php?page[api]=test")
Observable<List<Month>> getMonths(@Query("season_lookup") Season season);
/*...some files later...*/
service.getMonths(Season.AUTUMN);
और यह भी उसके परिणाम के बारे में वास्तव में कुछ होने के लिए प्रवेश करने जोड़ा गया:
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build();
लेकिन यह विफल रहा है। @Query
ने पूरी तरह से @SerializedName
को अनदेखा किया और इसके बजाय .toString()
का उपयोग किया, इसलिए लॉग ने मुझे .../index.php?page[api]=test&season_lookup=AUTUMN
दिखाया।
मैं रेट्रोफिट स्रोतों का पता लगाया और लाइनों के साथ फ़ाइल RequestFactoryParser
पाया:
Converter<?, String> converter =
retrofit.stringConverter(parameterType, parameterAnnotations);
action = new RequestAction.Query<>(name, converter, encoded);
ऐसा लगता है, जैसे कि यह बिल्कुल enums के बारे में परवाह नहीं है। इन पंक्तियों से पहले, यह rawParameterType.isArray()
का परीक्षण एक सरणी या Iterable.class.isAssignableFrom()
और कुछ भी नहीं था।
रेट्रोफिट उदाहरण रचना है:
retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.API_ENDPOINT)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
gson
GsonBuilder().create()
है। मैंने स्रोतों पर देखा, enums के लिए इसमें ENUM_TypeAdapters.ENUM_FACTORY
पूर्वनिर्धारित है, इसलिए मैं इसे छोड़ देता हूं।
सवाल मेरे enums परtoString()
का उपयोग कर रोकने के लिए और@SerializedName
उपयोग करने के लिए मैं क्या कर सकते हैं? मैं अन्य उद्देश्यों के लिएtoString()
का उपयोग करता हूं।
आप उचित कनवर्टर अपने रेट्रोफिट को जोड़ा गया है? https://github.com/square/retrofit/tree/master/retrofit-converters –
ऐसा लगता है कि रेट्रोफिट
क्रमबद्ध करते समय जीसन का उपयोग करता है, लेकिन नहीं, क्योंकि के साथ यह सही तरीके से क्रमबद्ध है। –@ DawidSzydło, लेकिन क्या 'Enum >' के लिए कन्वर्टर जैसे कुछ लिखने का कोई तरीका है? मैं '@ SerializedName' – Nexen