开发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())
这样的额外行来改进实例,但我不知道应该如何实现这个转换器。
答案 0 :(得分:3)
将您的自定义序列化/反序列化像这样:
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();
}
要求改造使用那个gson:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(getGson()))
.build();