Как можно десериализовать ответ Retrofit с помощью Gson для разных типов списков? - PullRequest
0 голосов
/ 10 мая 2018

Я регистрирую TypeAdapter, когда создаю свой экземпляр Retrofit, который делегирует все вызовы API, ожидающие ответа List:

val retrofit = Retrofit.Builder()
                .client(client)
                .baseUrl("$baseURL/")
                .addConverterFactory(
                        GsonConverterFactory.create(
                                GsonBuilder().registerTypeAdapter(List::class.java, MatchesDeserializer()) //Delegates all calls expecting return of type List.
                                        .registerTypeAdapter(Array<String>::class.java, PhotoDeserializer()) //This works, because it's a different type.
                                        .registerTypeAdapter(Triple::class.java, ChatMessagesDeserializer())
                                        .create()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
                .build()

В настоящий момент единственные вызовы, которые я выполняю, ожидают List того же типа (Пользователь, что требует пользовательского десериализатора), но я хочу иметь возможность делать вызовы, возвращающие списки разных типов (скажем, Item, который автоматически десериализуется).Проблема в том, что я не могу указать, для какого типа списка должен использоваться MatchesDeserializer, так как литерал класса не может включать информацию о типе.Мы можем указать тип ответа Array без проблем.

GsonBuilder().registerTypeAdapter(List<String>::class.java, MatchesDeserializer()) //This doesn't compile.

Я мог бы изменить все вызовы, ожидающие, что List вернет JsonObject, и проанализировать его вручную с помощью моего десериализатора, или реализовать TypeAdapterFactory длявручную десериализовать только пользовательские типы.

Есть ли более элегантный способ сделать это?

...