Đây là tôi Retrofit
dụ:làm việc như thế Polymorphism với Gson (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);
}
mẫu:
class AbstractMessage {
String id;
}
class TextMessage extends AbstractMessage {
String textMessage;
}
class ImageMessage extends AbstractMessage {
String url;
String text;
}
Yêu cầu:
@GET("direct/messages")
Observable<List<AbstractMessage>> getMessages(@Header("Authorization") String authHeader, @Body RequestObject request);
Thi yêu cầu:
apiManager.getMessages(authHeader, requestObject)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<AbstractMessage>>() {
@Override
public void accept(List<AbstractMessage> messages) throws Exception {
...
}
});
Khi tôi thực hiện yêu cầu, tôi nhận được bộ sưu tập gồm AbstractMessage
đối tượng. JSON
có thể chứa cả tin nhắn văn bản và hình ảnh. Trong trường hợp của tôi, bộ chuyển đổi JSON
sẽ tạo ra AbstractMessage
và ánh xạ chỉ trường id
. Làm cách nào để tôi chuyển đổi để tạo các đối tượng TextMessage
và ImageMessage
ánh xạ tất cả các trường phù hợp và sau đó truyền đến AbstractMessage
. Hoặc có thể có một số giải pháp khác.
Tôi không biết Gson, nhưng nếu bạn sử dụng JacksonConverterFactory thay vào đó, bạn có thể sử dụng '@ JsonTypeInfo' để tạo, dựa trên trường phân biệt, một loại hoặc loại khác. Đây là một hướng dẫn tốt: http://www.baeldung.com/jackson-inheritance –