java - 如何使用 Gson 反序列化继承公共(public)基类的类型?

标签 java android inheritance gson deserialization

我有以下层次结构:

回应

public class Response implements Serializable {

    @SerializedName("message")
    @Expose
    private List<Message> messages;

    public List<Message> getMessages() {
        return messages;
    }

    public void setMessages(List<Message> messages) {
        this.messages = messages;
    }

}

消息

public class Message implements Serializable {

        @SerializedName("type")
        @Expose
        @MessageType
        private int type;

        @SerializedName("position")
        @Expose
        @MessagePosition
        private String position;

        public int getType() {
            return type;
        }

        public String getPosition() {
            return position;
        }

        public void setType(@MessageType int type) {
            this.type = type;
        }

        public void setPosition(@MessagePosition String position) {
            this.position = position;
        }

}

文本 -> 消息

public class TextMessage extends Message {

@SerializedName("text")
@Expose
private String text;

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

}

图像 -> 消息

public class ImageMessage extends Message {

    @SerializedName("attachment")
    @Expose
    private Attachment attachment;

    public Attachment getAttachment() {
        return attachment;
    }

    public void setAttachment(Attachment attachment) {
        this.attachment = attachment;
    }

}

尝试使用 GSon 以这种方式反序列化 Message(自然)会导致 textattachment 字段中的字段为空。 我希望有一个最适合的反序列化,它会根据响应在运行时选择哪种消息类型(即文本或图像)与要满足的大多数字段相匹配。

到目前为止我唯一的想法是:

1 - 使用@JsonAdapter -> 不起作用

2 - 创建另一个层次结构以在编译时指向类,例如:

---- Response
   |
    - TextResponse -> List<TextMessage>
   |
    - ImageResponse -> List<ImageMessage>

第二个选项并不是我真正想要的,它让我以一种可能变得过于复杂而无法应用以后维护的方式增加类的数量。

有谁知道解决这个问题的方法吗?有什么可以应用的框架或概念吗?

提前致谢

最佳答案

也许你可以使用 Gson extras RunTimeTypeAdapterFactory。检查这个例子:

RuntimeTypeAdapterFactory<Message> factory = RuntimeTypeAdapterFactory
    .of(Message.class, "type") // actually type is the default field to determine
                               // the sub class so not needed to set here
                               // but set just to point that it is used
    // assuming value 1 in field "int type" identifies TextMessage
    .registerSubtype(TextMessage.class, "1")
    // and assuming int 2 identifies ImageMessage
    .registerSubtype(ImageMessage.class, "2");

然后使用GsonBuilder.registerTypeAdapterfactory(factory)来使用它。

这只是在 Gson 核心库中找不到。您需要fetch it here 。您可能还会从某人已经完成的全局存储库中找到一些 Maven/Gradle 依赖项,但也许最简单的方法就是复制此文件。

如果您需要修改其行为,它可以启用以后的黑客攻击。

关于java - 如何使用 Gson 反序列化继承公共(public)基类的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54346010/

相关文章:

java - 使用restfb从facebook获取所有 friend

java - 在处理 ArrayList 时,我可以用什么来替代 charAt?

android - 明确地关闭 SQLite 数据库中的 Cursor,需要还是不需要?

java - 使用继承的重载方法

javascript - JavaScript 类中使用箭头函数的继承和多态性

java - Android List View设置没有动画的默认位置

java - Java中水平翻转区域

java - Android Webview 应用程序,上传图片不起作用,点击选择照片时没有任何反应

java - 通过 Post Android 发送数据到 PHP

python multiprocessing - 在使用 Process.start(target=func) 调用的函数中访问进程名称