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

2024-03-29

开发 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 and Van.class) 正在扩展基类Car.class

目前我的Car.class看起来像这样:

public class Car {
    public String type;
    public String id;
    public boolean isClean;
    public int seats;
    public int fuelTankCapacity;
}

但我想要这样的汽车、货车和出租车模型:

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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改造:将对象列表反序列化为不同类型 的相关文章

随机推荐

  • 使用正则表达式修剪电话号码

    可能是一个简单的正则表达式问题 如何从电话号码中删除除前导 之外的所有非数字 i e 012 3456 gt 0123456 1 234 56789 gt 123456789
  • 为什么模式匹配一​​个单词而有两个相同的单词?

    请看一下这个 如你所见 只有one匹配于regex101 但浏览器匹配two相同的单词 所以为什么regex101无法匹配第二个单词 无论如何我需要匹配这两个词 或更多 如果存在的话 注意到它与以下内容无关g旗帜 因为我在小提琴中使用过它
  • CreateProcessAsUser 和 LogonUser 无密码

    使用 WTSGetActiveConsoleSessionId 和 WTSQueryUserToken 我知道作为 SYSTEM 运行的服务可以在当前桌面上启动应用程序 http blog dcuktec com 2009 05 pytho
  • 防止 Azure B2C 自定义策略中的电子邮件更改

    有没有办法防止密码重置期间更改电子邮件 有密码恢复的标准政策 但我不喜欢在那里更改电子邮件 该电子邮件用作与其他应用程序集成的 ID 密码重置期间更改电子邮件不会更改用户的实际电子邮件 如果用户验证电子邮件但随后意识到这不是他们想要重置密码
  • python 使用 numpy 进行位移

    我正在使用 64 位无符号整数 并在位移后比较该值 然后再解码其余位值 我正在迭代数百万个值并尝试最大程度地减少处理时间 问题是 uint64 和 numpy uint64 都不支持位移位 我试图避免使用 int64 以避免负值 示例数据
  • PHP HTML 净化器和 MathML

    有没有什么简单的方法可以允许所有 MathML 标签在 HTML Purifier 中具有属性 我试图将所有 MathML 标签从https developer mozilla org en US docs Web MathML Eleme
  • 是否有实体框架 7 数据库优先 POCO 生成器?

    我一直在为我正在开发的一个新项目使用 Entity Framework 7 和 ASP NET 5 但遇到了障碍 我所在的团队使用 DBA 优先的开发方法 即数据库由 DBA 设计 然后开发人员更改代码以补偿模型更改 使用 EF6 效果很好
  • 如何使图像高度适合并置文本高度

    我有一个图像和一个并排的文本 图像在左边 文本在右边 关于如何根据文本段落高度 以及宽度与高度保持比例 调整图像高度的任何想法 而不是将文本环绕在图像周围 这是我所能做到的 div style display table width 100
  • Flask jsonify 支持 UTF-8 吗?

    我一直在使用 Flasks 和 jsonify 进行实验 有用 但不支持 utf 8 字符 土耳其字符 我正在使用字典 if api key in key list quotes ataturk Hayatta En Hakiki Murs
  • 如何在启动时完全停止 Android Studio 索引/扫描/构建?

    我怎样才能停止这个索引或任何这个启动过程 它是做什么用的 它为什么这么做 我可以在以后最需要的时候推迟加载这么大的进程吗 我通过无效并重新启动解决了这个问题 我在循环中遇到了这个问题 在没有运行或构建任何东西的情况下不停地索引 文件 gt
  • ModelAttribute 可以是原始的吗?

    我在 Spring MVC 3 0 中的 ModelAttribute 上遇到了一个奇怪的问题 当我在本地主机部署应用程序时 它工作正常 但是当我在远程服务器上部署该应用程序时 每次用户访问特定操作时它都会失败 并出现错误 ERROR my
  • 互斥的powershell参数

    SCENARIO 我正在使用 Visual Studio 2008 和 NET 3 5 为 Powershell 2 0 编写 cmdlet 该 cmdlet 需要 3 个参数 我想要的 cmdlet 语法是这样的 cmdletname f
  • Apache2中可以有两个密码文件吗?

    我可以在 apache2 sites enabled 000 default 配置文件中包含两个 AuthUserFile 指令吗
  • Google App Engine“搜索”的测试床存根

    我正在尝试使用开发应用程序服务器在 Python 中测试 Google App Engine 的新全文搜索功能 是否有存根search https developers google com appengine docs python se
  • Spark:“无法使用 UnspecifiedFrame。这应该在分析过程中进行转换。请提交错误报告”

    Spark 2 3 0 与 Scala 2 11 我正在尝试编写一个自定义聚合器并在每个窗口函数上运行它这些文档 https spark apache org docs latest sql programming guide html t
  • Google Guava 供应商示例

    请用合适的例子解释Supplier in Guava 接口的使用 The Supplier接口只是一个返回值的无参数函数的抽象 它是一个获取对象的某个或多个实例的方法 因为它很通用 所以可以用来做很多事情 贾里德解释了如何Multimaps
  • 如何设置 Heroku Postgresql 的日志记录级别?

    将 Heroku 与 Postgresql 插件结合使用 在查看我的日志后 似乎 postgresql 正在记录每个 单个 事务 我知道您可以通过执行类似的操作来设置日志级别 https www postgresql org docs 9
  • 字体和颜色 - #region

    是否可以更改 region 和 endregion 的字体颜色 我在以下位置找不到这个元素extras options fonts and colors 它在这里 TOOLS gt Options gt Environment gt Fon
  • csv-parse 解析的对象的第一个属性不可访问

    我正在使用以下内容解析 csv 文件csv 解析 https csv js org parse userID sysID 20 50 30 71 但是 在返回的对象上 无法访问从第一列创建的属性userID 这是我的代码 async fun
  • 改造:将对象列表反序列化为不同类型

    开发 Android 应用程序 我正在使用改造来得到我的回应 目前我已经制作了一个 POJO 模型类 其中包含所有类型的字段 实际上它们有更多的字段和自己的方法 所以我在这里简化了它们很多 代码来自Client class OkHttpCl