当前位置: 首页 > 知识库问答 >
问题:

多态反序列化gson[duplicate]

龙新荣
2023-03-14

我有一个车辆接口,其中CarBus实现。服务器会返回这样的响应-

{
    "id" : 10,
    "vehicle_type" : "Car",
    "vehicle" : {
          "id"  : 100,
          "name" : "MyCar"
    }
    // More attributes.
}

相应的类来建模它是

class Response {
    int id;
    String vehicle_type;
    Vehicle vehicle;
    // More attributes.
}

响应中的vehicle_type声明它是哪种车辆。我需要反序列化的响应成一个响应对象取决于vehicle_type。如果是Car,我需要在反序列化响应Bus.class期间使用Car.class反序列化车辆

如何使用gson实现这一点?

编辑-这篇文章的不同之处在于类类型(type)包含在需要反序列化的jsonobject中。这里不是。如果车辆类型车辆内,我可以为车辆编写自定义反序列化程序,检查车辆类型,并进行相应的反序列化。但是我想我需要为Response编写一个自定义反序列化程序,在这里我创建一个新的Response对象,解析vehicle\u type,将其反序列化为vehicle对象,并通过解析手动将其和Response的其他属性添加到Response对象中。这非常麻烦,使用gson也没有什么帮助。我希望有更好的解决办法。:)

共有1个答案

松新
2023-03-14

因此,我为Response编写了一个自定义反序列化程序,首先调用默认的反序列化程序,获取车辆类型,并相应地执行车辆反序列化。

public Response deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
    Response response = new Gson().fromJson(jsonElement, Response.class);
    Type t = null;
    if (response.getVehicleType().equals(Bus.vehicle_type)) {
        t = Bus.class;
    } else if (response.getVehicleType().equals(Car.vehicle_type)) {
        t = Car.class;
    }
    JsonObject object = jsonElement.getAsJsonObject();
    if (object.has("vehicle")) {
        JsonElement vehicleElement = object.get("vehicle");
        Vehicle vehicle = jsonDeserializationContext.deserialize(vehicleElement, t);
        response.setVehicle(vehicle);
    }
    return response;
}

期待更好的解决方案。:)

 类似资料:
  • 问题内容: 使用Gson 2.2.2,我正在尝试序列化POJO(行为)的数组列表。 我有一个适配器,几乎是我在网上看到的一个副本: 我这样注册: 然后,当我尝试序列化我的ArrayList时: 我出现堆栈溢出。 似乎在线上: 它开始递归循环,一次又一次地通过我的序列化器。那么,我该如何注册它以免发生这种情况?我需要序列化列表并保持多态性。 问题答案: 看起来您发现了JsonSerializer文档

  • 问题内容: 我如何反序列化此json: 使用Google GSON? 问题答案: 要反序列化JSON,您需要为递归接口使用自定义反序列化器。在这种类中,您需要检查JSON并确定要实例化为JSON本身的type字段的类。在这里,您有一个我为您编写的示例基本解串器。 当然,管理边界事件可以得到改善(例如,如果没有类型字段,会发生什么情况?)。 这是我的代码的结果:

  • 问题内容: 我正在尝试使用Gson将涉及多态的对象序列化/反序列化为JSON。 这是我的序列化代码: 结果如下: 序列化大多的作品,除了它缺少继承成员的内容(尤其是和字符串丢失)。这是我的基类: 这是我的继承类(ObixOp)的样子: 我意识到我可以为此使用适配器,但是问题是我正在序列化基类type的集合。从中继承大约25个类。我该如何优雅地进行这项工作? 问题答案: 我认为自定义序列化器/反序列

  • 我正在尝试使用Gson将一个涉及多态性的对象序列化/反序列化为JSON。 这是我的序列化代码: 结果是这样的: 序列化主要工作,除了它缺少继承成员的内容(特别是和字符串丢失)。这是我的基类: 下面是我继承的类(ObixOp)的样子: 我意识到我可以使用适配器来实现这一点,但问题是我正在序列化一个基类类型的集合。大约有25个类继承自此。我怎样才能优雅地完成这项工作?

  • 我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。 我的基本类看起来像: ...和一个派生自的类: ... 我试图执行以下代码: String是: 但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它

  • 我正在开发一个应用程序,它使用Gson作为JSON反序列化器,需要从REST API反序列化多态JSON。在解释mi问题之前,请注意,我已经用Gson研究了多态反序列化,并在几个案例中成功地实现了它。这是我面临的一个具体问题。在问这个问题之前,我也读过这篇很棒的帖子和关于堆栈溢出的讨论。顺便说一下,我正在使用RuntimeTypeAdapterFactory来反序列化多态对象。 我遇到的问题是,G