Definir el tipo de retorno de modificación utilizando la interfaz en lugar de la class

Tener una interfaz de actualización sencilla

interface Movies { @GET("movies/trending") fun trending(): Observable<List<TrendingMovie>> } 

¿Es posible definir TrendingMovie como interfaz (el resultado sería Observable emitiendo una list de las classs anónimas que implementan esta interfaz)?

(Intenté hacer esto, pero obtuve java.lang.IllegalArgumentException: No JsonAdapter para la interfaz com.test.TrendingMovie)

Sí, eso es definitivamente posible, pero requiere que agregue un deserializador personalizado para la interfaz. Esto se hace registrando un deserializador de tipo personalizado para la herramienta de deserialization que utiliza.

Con Jackson (que recomendaría utilizar para trabajar con classs de Kotlin, después de todo), esto se hace agregando un Module al ObjectMapper . Aquí están los pasos que hice para hacer esto con jackson-module-kotlin :

  1. Cree un Module personalizado con un JsonDeserializer agregado para su interfaz:

     fun trendingMovieModule(): Module = SimpleModule().apply { val deserializer: JsonDeserializer<TrendingMovie> = object : JsonDeserializer<TrendingMovie>() { override fun deserialize(p: JsonParser, ctxt: DeserializationContext): TrendingMovie { val node = p.codec.readTree<JsonNode>(p) return object : TrendingMovie { // Your anonymous class here, for example: val name = node["movie"]["title"] val watchers = node["watchers"].intValue() override fun toString(): String = "$name, watchers: $watchers" } } } addDeserializer(TrendingMovie::class.java, deserializer) } 
  2. Registre el module con el ObjectMapper que usa para el constructor Retrofit :

     val mapper = jacksonObjectMapper() .registerModule(trendingMovieModule()) 
  3. Utilice el mapper en el constructor Retrofit :

     val r = Retrofit.Builder() // other necessary configuration omitted, eg custom OkHttpClient .baseUrl("https://api.trakt.tv") .addConverterFactory(JacksonConverterFactory.create(mapper)) .build().create(Movies::class.java) 

    JacksonConverterFactory requiere dependencia: converter-jackson .

  4. ¡Hecho! Debería funcionar ahora:

     r.trending().flatMap { Observable.from(it) }.forEach(::println) 

    Archivo fuente completo: (aquí)

  • Cómo volver a intentar el retroceso exponencial en corotines de kotlin
  • reference no resuelta: callback
  • Retrofit2 y kotlin
  • java.lang.NoClassDefFoundError: com.example.api.retrofit.AuthenticationInterceptor $ intercepte $ 1
  • Adaptar el cuerpo de la respuesta 2 a la class personalizada
  • OnErrorNotImplementedException utilizando RxJava2 y Retrofit2 Mosby MVI
  • Adaptador personalizado de Moshi con RxAndroid & Retrofit & Kotlin
  • Múltiples requestes de modificación2 usando Flowable en Kotlin
  • Dagger2 no puede acceder a las anulaciones. javax.annotation.Nullable not found
  • Android: uso de generics para tener 1 llamada de actualización de RxJava que devuelve varios types usando la misma interfaz
  • Retrofit: get un cuerpo vacío en la actualización de respuesta