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í)

  • RxJava2 + Retrofit pantalla negra en request de datos
  • Problemas para get API de Meetup Token de acceso con modificación - Android
  • Readaptación con kotlin, incapaz de crear @Body
  • HttpException no capturado por onError ()
  • Los parameters generics Cualquiera de kotlin se convierte en comodines (?)
  • Clase de datos KotlinReflectionInternalError
  • Recuperar respuesta JSON de rxjava / retrofit request POST
  • Adaptador personalizado de Moshi con RxAndroid & Retrofit & Kotlin
  • Dagger2 no puede acceder a las anulaciones. javax.annotation.Nullable not found
  • HttpLoggingInterceptor no inicia session con la actualización 2
  • Obtención de class no encontrada Excepción al usar KotlinJsonAdapterFactory () en Moshi 1.5 con Kotlin