android - 改造 : Deserializing list of objects into different types

标签 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())改造实例,但我不知道我应该如何实现这个转换器..

最佳答案

像这样创建您的自定义序列化/反序列化:

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/

相关文章:

android - ActionBar刷新

java - 正则表达式:如何在正则表达式中操作 "AND"这种表达式?

三星手机中的 Android AudioTrack 出现奇怪的噪音

java - Jackson2 objectmapper 未将请求映射到对象

android - ProGuard for Android 和 Retrofit2 Converter Gson?

android - 为什么我应该为不同的设备尺寸创建 android 图标?

c# - 将 Json 字符串转换为 C# 对象无效

java - 如何向创建的 GSON 添加属性到 JSON?

android - 如何在 token 验证器和注销用户中显示错误消息

android - java.lang.IllegalStateException : Expected BEGIN_OBJECT but was BEGIN_ARRAY Kotlin 错误