改造:将对象列表反序列化为不同类型

时间:2017-10-27 06:50:08

标签: android json retrofit2

开发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.classCar.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())这样的额外行来改进实例,但我不知道应该如何实现这个转换器。

1 个答案:

答案 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();