我有一个车辆
接口,其中Car
和Bus
实现。服务器会返回这样的响应-
{
"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也没有什么帮助。我希望有更好的解决办法。:)
因此,我为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