У меня есть следующая иерархия:
ОТВЕТ
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>
Второй вариант не совсем то, что я хочу, и заставляет меня умножать количество классов таким образом, что это может оказаться слишком сложным, чтобы применять последующее обслуживание.
Кто-нибудь знает способ решения этой проблемы?Какие-либо рамки или концепции, которые могут быть применены?
Заранее спасибо