java – 多态性如何与Gson一起工作(Retrofit)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 多态性如何与Gson一起工作(Retrofit),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2579字,纯文字阅读大概需要4分钟。
内容图文
![java – 多态性如何与Gson一起工作(Retrofit)](/upload/InfoBanner/zyjiaocheng/702/8caaac79aed44cdda27d320713f7d918.jpg)
这是我的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);
}
模型:
class AbstractMessage {
String id;
}
class TextMessage extends AbstractMessage {
String textMessage;
}
class ImageMessage extends AbstractMessage {
String url;
String text;
}
请求:
@GET("direct/messages")
Observable<List<AbstractMessage>> getMessages(@Header("Authorization") String authHeader, @Body RequestObject request);
执行请求:
apiManager.getMessages(authHeader, requestObject)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<AbstractMessage>>() {
@Override
public void accept(List<AbstractMessage> messages) throws Exception {
...
}
});
当我执行一个请求时,我收到了一个AbstractMessage对象的集合. JSON可以包含文本和图像消息.在我的例子中,JSON转换器创建AbstractMessage并仅映射id字段.如何使转换器创建TextMessage和ImageMes??sage对象映射所有匹配的字段,然后将其强制转换为AbstractMessage.或者可能还有其他一些解决方案.
解决方法:
您必须为对象AbstractMessage,TextMessage和ImageMes??sage创建一个RuntimeTypeAdapterFactory,然后必须将其设置为gson实例.
假设你有这些对象:
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;
}
}
下面是您需要的RuntimeTypeAdapter,以便正确地反序列化(和序列化)这些对象:
RuntimeTypeAdapterFactory<Animal> runtimeTypeAdapterFactory = RuntimeTypeAdapterFactory
.of(Animal.class, "type")
.registerSubtype(Dog.class, "dog")
.registerSubtype(Cat.class, "cat");
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(runtimeTypeAdapterFactory)
.create();
类RuntimeTypeAdapterFactory.java不随Gson包一起提供,因此您必须手动下载.
请注意,你的问题的标题应该是“与Gson的多态性”
我希望它有所帮助.
内容总结
以上是互联网集市为您收集整理的java – 多态性如何与Gson一起工作(Retrofit)全部内容,希望文章能够帮你解决java – 多态性如何与Gson一起工作(Retrofit)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。