Это работает, но это ужасно - есть ли лучший способ?
У меня есть универсальный класс, который в этом простом примере выглядит следующим образом
public class MsgWrapper<T> {
@Expose
private T Message;
@Expose
private String Type;
private String uri;
}
Сериализация неприятна, но тривиальна, например
Type typeToken = new TypeToken<MsgWrapper<Notice>>(){}.getType();
gson.toJson(message,typeToken);
Сервер получает JSON, который может быть либо
MsgWrapper<Notice> or MsgWrapper<Alert>
Если это уведомление, то в поле «Тип» будет указано «уведомление».
Если это предупреждение, то в поле «Тип» будет указано «предупреждение»
На данный момент я реализовал пользовательский десериализатор
public MsgWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject object = json.getAsJsonObject();
if(object.has("Type"))
{
MsgWrapper msgWrapper=new MsgWrapper();
msgWrapper.setType(object.get("Type").getAsString());
if(msgWrapper.getType().equalsIgnoreCase("Notice"))
{
msgWrapper.setMessage(context.deserialize(object.get("Message"), Notice.class));
}
else if(msgWrapper.getType().equalsIgnoreCase("Alert"))
{
msgWrapper.setMessage(context.deserialize(object.get("Message"), Alert.class));
}
return msgWrapper;
}
else
{
throw new JsonParseException("something is wrong...");
}
}
}
Это кажется очень неуклюжим и неправильным. Есть ли лучший способ?