我具有以下层次结构:
响应
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反序列化消息会(自然)导致text
或attachment
字段为空字段。 我希望有一个最合适的反序列化方法,它会根据响应在运行时选择哪种消息类型(即文本或图像)与要完成的大多数字段相匹配。
到目前为止,我唯一的想法是:
1-使用@JsonAdapter->无效
2-创建另一个层次结构以在编译时指向类,例如:
---- Response
|
- TextResponse -> List<TextMessage>
|
- ImageResponse -> List<ImageMessage>
第二个选项并不是我真正想要的,并且使我增加类的数量,而这可能会变得太复杂而无法应用以后的维护。
有人知道解决这个问题的方法吗?有没有可以应用的框架或概念?
预先感谢
答案 0 :(得分:0)
我使用GodClass
实现了此功能,该功能具有所有消息类型字段。
但是您不能在应用程序中将此POJO类用作DTO(数据传输对象)。
Json
是一个协议,不支持Inheritance
等。
在同一场景中,我为DTO实现了这种继承和层次结构。
PS:我的答案中的DTO是我们在Adapter
或Activity
等中传递的模型。
答案 1 :(得分:0)
也许您可以使用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部门,但最简单的方法就是复制此文件。
如果需要修改其行为,它将启用以后的黑客攻击。