gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:08:28 27 4
gpt4 key购买 nike

我有以下层次结构:

响应

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 dep,有人已经完成了,但也许最简单的方法就是复制此文件。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com