ich eine einfache ENUM haben:Wie übergeben benutzerdefinierte Enum in @Query über Retrofit?
public enum Season {
@SerializedName("0")
AUTUMN,
@SerializedName("1")
SPRING;
}
eine Version starten, wurde Gson der Lage, solche Aufzählungen zu analysieren. Um sicherzugehen, habe ich Folgendes getan:
Es funktioniert, wie ich erwartet habe. Ausgabe ist "0"
. Also versuchte ich es in meinem Retrofit-Dienste verwenden:
@GET("index.php?page[api]=test")
Observable<List<Month>> getMonths(@Query("season_lookup") Season season);
/*...some files later...*/
service.getMonths(Season.AUTUMN);
Und auch hinzugefügt Anmeldung wirklich sicher sein, um sein Ergebnis:
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build();
Aber es ist fehlgeschlagen. @Query
völlig ignoriert @SerializedName
und .toString()
stattdessen verwendet, so dass das Protokoll mir .../index.php?page[api]=test&season_lookup=AUTUMN
angezeigt.
Ich verfolgte Quellen Retrofit und gefunden Datei RequestFactoryParser
mit Linien:
Converter<?, String> converter =
retrofit.stringConverter(parameterType, parameterAnnotations);
action = new RequestAction.Query<>(name, converter, encoded);
Es scheint, wie es überhaupt nicht um Aufzählungen schert. Vor diesen Zeilen testete es rawParameterType.isArray()
zu einem Array oder Iterable.class.isAssignableFrom()
und nichts mehr.
Retrofit Beispiel Schöpfung:
retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.API_ENDPOINT)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
gson
ist GsonBuilder().create()
. Ich schaute auf Quellen, dort ist ENUM_TypeAdapters.ENUM_FACTORY
für enums vordefiniert, also lasse ich es so wie es ist.
Die Frage ist, was kann ich tun zu verhinderntoString()
auf meiner Aufzählung mit und@SerializedName
verwenden? Ich benutzetoString()
für andere Zwecke.
Haben Sie richtigen Konverter haben zu Ihrem Retrofit hinzugefügt? https://github.com/square/retrofit/tree/master/retrofit-converters –
Es scheint, dass Retrofit Gson beim Serialisieren
, aber nicht verwendet, weil mit es richtig serialisiert ist. –@ DawidSzydło, aber gibt es eine Möglichkeit, etwas wie Konverter für 'Enum >' nur zu schreiben? Ich möchte Reflection in das für @ SerializedName verwenden – Nexen