开发 Android 应用程序。 我正在使用改造来获得我的回应。目前我已经制作了一个 POJO 模型类,其中包含来自所有类型的字段(实际上他们有更多的字段和他们自己的方法,所以我在这里简化了很多)。
代码来自 Client.class
:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(30, TimeUnit.SECONDS);
OkHttpClient okHttpClient = builder.build;
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
我想要实现的是扩展基类 Taxi.class
的所有类型(Van.class
和 Car.class
)的特定模型
目前我的Car.class
看起来像这样:
public class Car {
public String type;
public String id;
public boolean isClean;
public int seats;
public int fuelTankCapacity;
}
但我想要像这样的 Car、Van 和 Taxi 模型:
public class Car {
public String type;
public String id;
}
public class Van extends Car {
public int fuelTankCapacity;
}
public class Taxi extends Car {
public boolean isClean;
public int seats;
}
来自服务器的响应(JSON):
{
"items": [{
"type": "taxi",
"id": "1i2ilkad2",
"isClean": "true",
"seats": "5"
},
{
"type": "van",
"id": "aopks21k",
"fuelTankCapacity": 76
}, etc...
]
}
我知道应该以某种方式添加额外的行,例如 .addConverterFactory(new CarJSONConverter())
改造实例,但我不知道我应该如何实现这个转换器..
最佳答案
像这样创建您的自定义序列化/反序列化:
static class CarDeserializer implements JsonDeserializer<Car> {
@Override
public Car deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
String type = obj.get("type").getAsString();
if (type.equalsIgnoreCase("van")) {
// return van
} else {
// return taxe
}
return null;
}
}
static class CarSerializer implements JsonSerializer<Car> {
@Override
public JsonElement serialize(Car src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject obj = new JsonObject();
if (src instanceof Taxi) {
// code here
} else if (src instanceof Van) {
// code here
}
return obj;
}
}
使用自定义序列化器/反序列化器创建 gson
Gson getGson() {
return new GsonBuilder().registerTypeAdapter(Car.class, new CarDeserializer())
.registerTypeAdapter(Car.class, new CarSerializer()).create();
}
要求 retrofit 使用那个 gson:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(getGson()))
.build();
关于android - 改造 : Deserializing list of objects into different types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46969104/