私は、単純な列挙型があります。Retrofit経由で@Queryのカスタム列挙型を渡すには?
public enum Season {
@SerializedName("0")
AUTUMN,
@SerializedName("1")
SPRING;
}
いくつかのバージョンを開始し、GSONは、このような列挙型を解析することが可能となりました。確認するために、私はこれをしました:
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);
それは、そうです。これらの行の前では、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()
です。私はソースを覗いて、enumのためにあらかじめ定義されたENUM_TypeAdapters.ENUM_FACTORY
があるので、そのまま残しておきます。
質問は私の列挙型にtoString()
を使用して防止し@SerializedName
を使用するように、私は何ができるのでしょうか?私は他の目的のためにtoString()
を使用します。
を持っていますか? https://github.com/square/retrofit/tree/master/retrofit-converters –
Retrofitは
をシリアライズしている間にGsonを使用していますが、 では正しい方法でシリアライズされているため、 ではありません。 –@DawidSzydłoですが、 'Enum >'のコンバーターのようなものを書く方法はありますか? '@ SerializedName'のためにリフレクションを使用したいと思います。 – Nexen