我有一个json字符串,我想Map到我的java对象。我目前正在使用gson来实现这一点。然而问题是,我已经设置了我的POJO的一部分来包含一个抽象类。我如何正确Map对应于这个抽象类的json呢?
澄清:
下面是一个我当前正在接收的json字符串的示例:
{
"Items" : [
{
"id" : "ID1",
"seller_id": 17,
"item_plan": {
"action" : "Sell"
}
},
{
"id" : "ID2",
"seller_id": 27,
"item_plan": {
"action": "Remove",
}
}
]
}
我的请求对象设置如下:
public class RequestObject {
@SerializedName("Items")
@Expose
private List<Item> items = null;
public class Item {
@SerializedName("id")
@Expose
private String id;
@SerializedName("seller_id")
@Expose
private Integer sellerID;
@SerializedName("item_Plan")
@Expose
private ItemPlan item_plan;
public abstract class ItemPlan {
@SerializedName("action")
@Expose
private String action;
public abstract void executePlan()
正如你所看到的,我的请求对象有一个抽象类代表item_plan。这里的想法是item_plan操作将有自己的执行方式,因此有一个名为ItemPlan的父类,其中每个子类将代表可能的操作计划和自己的executionPlan,即(SellPlan是ItemPlan的子类,其中SellPlan有自己的函数executionPlan()的实现)。
如何将示例json字符串Map到下面的Java类?
我已尝试以下方法:
RuntimeTypeAdapterFactory<ItemPlan> itemPlanRuntimeTypeAdapterFactory =
RuntimeTypeAdapterFactory
.of(ItemPlan.class, "action")
.registerSubtype(SellPlan.class, "Sell")
.registerSubtype(RemovePlan.class, "Remove");
Gson gson = new
GsonBuilder().registerTypeAdapterFactory(itemPlanRuntimeTypeAdapterFactory).create();
RequestObject request = gson.fromJson(jsonString, RequestObject.class);
然而,这并不起作用。它能够Map我所需要的一切,但它无法正确创建抽象类对象,即创建相应的子对象(SellPlan用于出售,RemovePlan用于移除),它将使这些类的操作字符串为空。有一个解决方法,我可以简单地在这些类的构造函数中手动设置操作字符串,但我宁愿不这样做。有办法解决这个问题吗?
- 谢谢-谢谢
1条答案
按热度按时间hwamh0ep1#
您可能必须使用
RuntimeTypeAdapterFactory.of
重载和额外的maintainType
参数,然后将true
作为值传递给maintainType
。否则,正如您所注意到的,Gson会在序列化过程中删除类型字段值,因此该字段将保留其默认值null
。