使用GSON将JSON字符串的一部分Map到抽象类

7rfyedvj  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(160)

我有一个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用于移除),它将使这些类的操作字符串为空。有一个解决方法,我可以简单地在这些类的构造函数中手动设置操作字符串,但我宁愿不这样做。有办法解决这个问题吗?

  • 谢谢-谢谢
hwamh0ep

hwamh0ep1#

您可能必须使用RuntimeTypeAdapterFactory.of重载和额外的maintainType参数,然后将true作为值传递给maintainType。否则,正如您所注意到的,Gson会在序列化过程中删除类型字段值,因此该字段将保留其默认值null

相关问题