多态反序列化gson
Polymorphic deserialization gson
我有一个 Vehicle
接口,由 Car
和 Bus
实现。服务器 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_type
将 response
反序列化为 Response
对象。如果它是 Car
我需要在反序列化 response
期间使用 Car.class
来反序列化 vehicle
,否则 Bus.class
。
如何使用 gson 实现此目的?
编辑 - This post 的不同之处在于 class 类型(type
)包含在需要反序列化的 jsonobject
中。在这里不是。如果 vehicle_type
在 vehicle
内,我可以为 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;
}
期待更好的解决方案。 :)
我有一个 Vehicle
接口,由 Car
和 Bus
实现。服务器 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_type
将 response
反序列化为 Response
对象。如果它是 Car
我需要在反序列化 response
期间使用 Car.class
来反序列化 vehicle
,否则 Bus.class
。
如何使用 gson 实现此目的?
编辑 - This post 的不同之处在于 class 类型(type
)包含在需要反序列化的 jsonobject
中。在这里不是。如果 vehicle_type
在 vehicle
内,我可以为 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;
}
期待更好的解决方案。 :)