sirve qué peticion para ejemplo consumir con java android json gson retrofit

java - qué - retrofit kotlin



¿Cómo funciona el polimorfismo con Gson(Retrofit) (1)

Aquí está mi instancia de Retrofit :

@Provides @Singleton ApiManager provideApiManager() { RxJava2CallAdapterFactory rxAdapter = RxJava2CallAdapterFactory.create(); OkHttpClient okHttpClient = new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor()) .build(); Gson gson = new GsonBuilder().create(); GsonConverterFactory converterFactory = GsonConverterFactory.create(gson); Retrofit retrofit = new Retrofit.Builder() .baseUrl(AppConstants.BASE_URL) .addConverterFactory(converterFactory) .addCallAdapterFactory(rxAdapter) .client(okHttpClient) .build(); return retrofit.create(ApiManager.class); }

Modelo:

class AbstractMessage { String id; } class TextMessage extends AbstractMessage { String textMessage; } class ImageMessage extends AbstractMessage { String url; String text; }

Solicitud:

@GET("direct/messages") Observable<List<AbstractMessage>> getMessages(@Header("Authorization") String authHeader, @Body RequestObject request);

Solicitud de ejecución:

apiManager.getMessages(authHeader, requestObject) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<List<AbstractMessage>>() { @Override public void accept(List<AbstractMessage> messages) throws Exception { ... } });

Cuando ejecuto una solicitud, recibo una colección de objetos AbstractMessage . El JSON puede contener tanto mensajes de texto como de imagen. En mi caso, JSON Converter crea AbstractMessage y asigna solo el campo de id . ¿Cómo puedo hacer el convertidor para crear objetos TextMessage e TextMessage y asignar todos los campos coincidentes y luego convertirlos en AbstractMessage ? O puede haber alguna otra solución.


Debe crear un RuntimeTypeAdapterFactory para los objetos AbstractMessage, TextMessage e ImageMessage y luego debe establecerlo en la instancia de gson.

Supongamos que tienes esos objetos:

public class Animal { protected String name; protected String type; public Animal(String name, String type) { this.name = name; this.type = type; } } public class Dog extends Animal { private boolean playsCatch; public Dog(String name, boolean playsCatch) { super(name, "dog"); this.playsCatch = playsCatch; } } public class Cat extends Animal { private boolean chasesLaser; public Cat(String name, boolean chasesLaser) { super(name, "cat"); this.chasesLaser = chasesLaser; } }

Este es el RuntimeTypeAdapter que necesita para deserializar (y serializar) correctamente esos objetos:

RuntimeTypeAdapterFactory<Animal> runtimeTypeAdapterFactory = RuntimeTypeAdapterFactory .of(Animal.class, "type") .registerSubtype(Dog.class, "dog") .registerSubtype(Cat.class, "cat"); Gson gson = new GsonBuilder() .registerTypeAdapterFactory(runtimeTypeAdapterFactory) .create();

La clase RuntimeTypeAdapterFactory no se incluye con el paquete Gson, por lo que debe descargarlo manualmente.

Puede leer más sobre el adaptador de tiempo de ejecución here y here

Tenga en cuenta que el título de su pregunta debe ser "Polimorfismo con Gson"

Espero que ayude.