多态反序列化gson

Polymorphic deserialization gson

我有一个 Vehicle 接口,由 CarBus 实现。服务器 returns 这样的响应 -

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

对应的class建模为

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

response中的vehicle_type声明了它是什么类型的车辆。我需要根据 vehicle_typeresponse 反序列化为 Response 对象。如果它是 Car 我需要在反序列化 response 期间使用 Car.class 来反序列化 vehicle ,否则 Bus.class

如何使用 gson 实现此目的?

编辑 - This post 的不同之处在于 class 类型(type)包含在需要反序列化的 jsonobject 中。在这里不是。如果 vehicle_typevehicle 内,我可以为 Vehicle 编写自定义反序列化器,检查 vehicle_type 并相应地反序列化。但我想我需要为 Response 编写一个自定义反序列化器,我在其中创建一个新的 Response 对象,解析 vehicle_type,相应地将其反序列化为 Vehicle 对象并添加它response 的其余属性通过解析手动添加到 Response 对象。这非常麻烦,那么使用 gson 并没有真正的帮助。我希望有一个更好的解决方案。 :)

所以我为 Response 编写了一个自定义反序列化器,我首先调用默认反序列化器,获取 vehicle type 并相应地进行 Vehicle 反序列化。

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;
}

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