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

Java 使用JSON反序列化程序,如何更改超类字段的映射?,java,android,json,inheritance,json-deserialization,Java,Android,Json,Inheritance,Json Deserialization,我正在使用一个抽象类管理一个数据库,这个抽象类有很多方便的方法。特别是,它有insert(Context)、update(Context)和delete(Context),这意味着您可以创建一组继承此类的不同对象,所有这些对象都有自己的数据库映射,只需逐个更新或插入它们 另一个开发人员已将GSON反序列化标记添加到此结构中。除了更新函数依赖于比较对象的唯一标识符之外,这工作正常;用作标识符的特定对象因对象而异。这意味着,当超类中有update(…)方法时 @SerializedName("id"

我正在使用一个抽象类管理一个数据库,这个抽象类有很多方便的方法。特别是,它有
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机制(例如更新方法),但在传入的JSON中有不同的字段来标识不同的对象。

我认为它将具有从传入的JSON映射的属性,如字符串customID、字符串foo、字符串栏

如果您能够以某种方式覆盖每个成员变量的setter,可能是生命周期事件,或者如果您在类中提供setCustomID(字符串customID),GSON将使用它而不是注释?然后您可以简单地调用super.setId(customID)

这类似于“动态”或“计算”字段

这篇文章表明GSON不太可能支持属性set/get


我不确定我是否真的得到了完整的问题(可能会有更多代码使用不同的ID,以及它们与gson的关系如何?),但在我看来,您可以在超类中定义一个
getId
方法,并重写子类中的方法,以返回要用作标识符的字段。这是一个非常好的主意,但遗憾的是,它告诉我“属性值必须是常量”(我有点认为它可能是,但即便如此,也是一个巧妙的想法)。我想说的是,您可以在更新方法中使用
新字符串[]{getId()}
,而不是
新字符串[]{mUUID}
,并使用默认实现
公共字符串getId(){return mUUID;}
例如,哦,现在我明白了。是的,那会有用的。不过,我真的很想知道你是否可以像这样更改反序列化映射,因为在我看来,这是一件非常有用的事情。@alobodzk在他们的答案下发表了一条有趣的评论,我将其粘贴在这里:>如果GSON允许在方法上使用
@Expose
,这会容易得多,然后对getId()访问器进行注释。要绕过这个问题,您可以使用这个坏小子:或者实现JsonSerializer对象,这将为您调用该方法。