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

我有以下层次结构:


回复


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 会导致(自然)在textor字段处清空attachment字段。我希望有一个最合适的反序列化,它基于响应将在运行时选择哪种消息类型(即文本或图像)与要完成的大多数字段匹配。


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


1 - 使用 @JsonAdapter -> 没用


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


---- Response

   |

    - TextResponse -> List<TextMessage>

   |

    - ImageResponse -> List<ImageMessage>

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


有谁知道处理这个问题的方法?任何可以应用的框架或概念?


提前致谢


噜噜哒
浏览 180回答 2
2回答

RISEBY

也许你可以使用 Gson extras RunTimeTypeAdapterFactory。检查这个例子:RuntimeTypeAdapterFactory<Message> factory = RuntimeTypeAdapterFactory&nbsp; &nbsp; .of(Message.class, "type") // actually type is the default field to determine&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// the sub class so not needed to set here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// but set just to point that it is used&nbsp; &nbsp; // assuming value 1 in field "int type" identifies TextMessage&nbsp; &nbsp; .registerSubtype(TextMessage.class, "1")&nbsp; &nbsp; // and assuming int 2 identifies ImageMessage&nbsp; &nbsp; .registerSubtype(ImageMessage.class, "2");然后GsonBuilder.registerTypeAdapterfactory(factory)用这个。这只是从 Gson 核心库中找不到。你需要在这里取。您可能还可以从全球 repo 中找到一些 Maven/Gradle dep 有人已经完成但也许最简单的就是复制这个文件。如果您需要修改其行为,它会启用以后的黑客攻击。

手掌心

我使用GodClass具有所有消息类型字段的方法实现了这一点。但是您不会在应用程序中将此 POJO 类用作 DTO(数据传输对象)。Json是一个协议,不支持Inheritance等等。在同一场景中,我为 DTO 实现了这种继承和层次结构。PS:我的答案中的 DTO 是我们传递的模型,例如 inAdapter或 anActivity等等。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java