有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用JSON反序列化程序,如何更改超类字段的映射?

我正在使用一个抽象类管理一个数据库,这个抽象类有很多方便的方法。特别是,它有insert(Context)update(Context)delete(Context),这意味着您可以创建一组继承此类的不同对象,所有这些对象都有自己的数据库映射,只需逐个更新或插入它们

另一个开发人员已将GSON反序列化标记添加到此结构中。除了更新函数依赖于比较对象的唯一标识符之外,这工作正常;用作标识符的特定对象因对象而异。这意味着,在中包含update(...)方法的超类

@SerializedName("id")
protected String mUUID;

子类将需要不同的映射

目前,我通过重写子类中的update(...)方法来解决这个问题,以便使用不同的标识字段进行比较,但这是非常不令人满意的。是否可以将不同的序列化名称映射到GSON中的超类字段,如果可以,如何实现

为了澄清,班级结构大致如下

public abstract class DatabasePersistent {
    //...
    @SerializedName("id")
    protected String mUUID;
    //...
    public int update(Context context) {
        return context.getContentResolver().update(
                getContentProviderURI(), //abstract, allows objects to update the right table 
                toContentValues(), //abstract, converts the object to a ContentValues
                UUID_EQUALS, //this is a where clause string
                new String[]{mUUID}
        );
    }
}

我想做一个决定

public class Thing extends DatabasePersistent {
    //all the abstract implementations
    //and so on
}

它以某种方式改变了mUUID的映射,因此我可以使用与超类中相同的主ID机制(例如update方法),但在传入的JSON中有不同的字段来标识不同的对象


共 (1) 个答案

  1. # 1 楼答案

    我认为它会有一些属性,比如字符串customID、字符串foo、字符串bar,这些属性都是从传入的JSON映射而来的

    如果您能以某种方式覆盖每个成员变量的setter——可能是一个生命周期事件,或者如果您在类中提供了一个setCustomID(字符串customID),GSON会使用它而不是注释吗?然后你可以直接打电话给super。setId(customID)

    这就像一个“动态”或“计算”字段

    这篇帖子表明GSON不太可能支持属性设置/获取

    Why does GSON use fields and not getters/setters?