【问题标题】:Using a JSON deserializer, how do you change the mapping of a superclass field?使用 JSON 反序列化器,如何更改超类字段的映射?
【发布时间】:2014-09-17 12:16:00
【问题描述】:

我正在使用一个抽象类来管理一个数据库,它有很多方便的方法。特别是它有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 中的不同字段标识不同的对象。

【问题讨论】:

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

标签: java android json inheritance json-deserialization


【解决方案1】:

我认为事物将具有从传入 JSON 映射的属性,例如 String customID、String foo、String bar?

如果您可以以某种方式覆盖每个事物成员变量的设置器 - 可能是生命周期事件,或者如果您在类中提供 setCustomID(String customID),GSON 将使用它而不是注释?那么你可以简单地调用 super.setId(customID)。

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

这篇文章表明 GSON 不太可能支持属性设置/获取。

Why does GSON use fields and not getters/setters?

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 2021-06-23
    • 2019-03-02
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多