【问题标题】:Retrofit: Deserializing list of objects into different types改造:将对象列表反序列化为不同类型
【发布时间】:2017-10-27 06:50:07
【问题描述】:

开发 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();

我想要实现的是扩展基类Car.class的所有类型(Taxi.classVan.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()) 这样的附加行来完成,但我不知道应该如何实现这个转换器..

【问题讨论】:

    标签: android json retrofit2


    【解决方案1】:

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

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

    【讨论】:

    • 经过一些修改,这是正确的答案。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2022-12-13
    • 2017-12-19
    • 2015-04-15
    • 2020-11-17
    • 2023-04-08
    • 1970-01-01
    • 2015-11-14
    • 2013-12-16
    相关资源
    最近更新 更多