我有一个 Message
类和一个扩展 Message
的 HistoryMessage
类。如何使用 Gson 反序列化 HistoryMessage
?
public class Message
{
@SerializedName("id")
private int id;
@SerializedName("date")
private long date;
@SerializedName("out")
private int out;
@SerializedName("user_id")
private int userId;
public Message(int id, long date, int userId, int out)
{
this.id = id;
this.date = date;
this.userId = userId;
this.out = out;
}
}
public class MessageHistory extends Message
{
@SerializedName("from_id")
private int fromId;
public MessageHistory(int id, long date, int userId, int out, int fromId)
{
super(id, date, userId, out);
this.fromId = fromId;
}
}
我有类 - Dialog,它是所有消息的容器
public class Dialog {
private int count;
private ArrayList<Message> dialogs = new ArrayList<Message>();
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public ArrayList<Message> getDialogs() {
return dialogs;
}
public void setDialogs(Message dialogs) {
this.dialogs.add(dialogs);
}
}
和 Message
的反序列化器,但我不知道如何反序列化 HistoryMessage
。
public Dialog deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Dialog dialog = new Dialog();
JsonArray jsonArray = (JsonArray)json.getAsJsonObject().get("response").getAsJsonObject().get("items");
int count = (Integer)json.getAsJsonObject().get("response").getAsJsonObject().get("count").getAsInt();
for ( int i = 0; i < jsonArray.size(); i++ ) {
JsonElement jsonElement = jsonArray.get(i);
Message message = new Message();
boolean unread = false;
if ( jsonElement.getAsJsonObject().has("unread")){
unread = true;
}
JsonObject object = (JsonObject)jsonElement.getAsJsonObject().get("message");
message = context.deserialize(object, Message.class);
message.setUnread(unread);
dialog.setDialogs(message);
}
dialog.setCount(count);
return dialog;
}
最佳答案
要使用 Gson,您需要指定要反序列化成的类型。如果要构造 HistoryMessage
实例,则需要将 HistoryMessage.class
传递给 fromJson()
调用。如果您不知道在编译时要尝试构造什么类型,您可以通过将类型存储在 JSON 中来解决它,如下答案所述:How to serialize a class with an interface?
但这绝对不是最佳实践。需要这样做表明您可能正在尝试反序列化为过于复杂的类型。考虑将反序列化代码与业务逻辑分开,例如将 JSON 反序列化为中间类,然后从该类构造您的 HistoryMessage
,而不是直接从 JSON 构造。
关于java - 如何用Gson反序列化子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28866307/