为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Gson 反序列化继承公共基类的类型?

如何使用 Gson 反序列化继承公共基类的类型?

噜噜哒 2022-05-21 21:07:48
我有以下层次结构:回复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")@Exposeprivate 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 会导致(自然)在textor字段处清空attachment字段。我希望有一个最合适的反序列化,它基于响应将在运行时选择哪种消息类型(即文本或图像)与要完成的大多数字段匹配。到目前为止,我唯一的想法是:1 - 使用 @JsonAdapter -> 没用2 - 创建另一个层次结构以在编译时指向类,例如:---- Response   |    - TextResponse -> List<TextMessage>   |    - ImageResponse -> List<ImageMessage>第二个选项并不是我真正想要的,它让我增加了类的数量,这种方式可能会变得太复杂而无法应用以后的维护。有谁知道处理这个问题的方法?任何可以应用的框架或概念?提前致谢
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

也许你可以使用 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 核心库中找不到。你需要在这里取。您可能还可以从全球 repo 中找到一些 Maven/Gradle dep 有人已经完成但也许最简单的就是复制这个文件。


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


查看完整回答
反对 回复 2022-05-21
?
手掌心

TA贡献1942条经验 获得超3个赞

我使用GodClass具有所有消息类型字段的方法实现了这一点。

但是您不会在应用程序中将此 POJO 类用作 DTO(数据传输对象)。

Json是一个协议,不支持Inheritance等等。

在同一场景中,我为 DTO 实现了这种继承和层次结构。

PS:我的答案中的 DTO 是我们传递的模型,例如 inAdapter或 anActivity等等。


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 179 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信