:ここでは、カスタムのデシリアライズを経由して、私のソリューションです。 gist hereが見つかります。
DateDeserializer.java
public class DateDeserializer<T extends Date> implements JsonDeserializer<T> {
private static final String TAG = DateDeserializer.class.getSimpleName();
private final SimpleDateFormat mSimpleDateFormat;
private final Class<T> mClazz;
public DateDeserializer(SimpleDateFormat simpleDateFormat, Class<T> clazz) {
mSimpleDateFormat = simpleDateFormat;
mClazz = clazz;
}
@Override
public T deserialize(JsonElement element, Type arg1, JsonDeserializationContext context) throws JsonParseException {
String dateString = element.getAsString();
try {
T date = mClazz.newInstance();
date.setTime(mSimpleDateFormat.parse(dateString).getTime());
return date;
} catch (InstantiationException e) {
throw new JsonParseException(e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new JsonParseException(e.getMessage(), e);
} catch (ParseException e) {
throw new JsonParseException(e.getMessage(), e);
}
}
}
次に、各フォーマットは、クラスにマッピングされている
sGson = new GsonBuilder()
.registerTypeAdapter(Event.EventDateTime.class,
new DateDeserializer<Event.EventDateTime>(
Event.EventDateTime.DATE_FORMAT, Event.EventDateTime.class))
.registerTypeAdapter(Event.StartEndDateTime.class,
new DateDeserializer<Event.StartEndDateTime>(
Event.StartEndDateTime.DATE_FORMAT, Event.StartEndDateTime.class))
.registerTypeAdapter(Event.SimpleDate.class,
new DateDeserializer<Event.SimpleDate>(
Event.SimpleDate.DATE_FORMAT, Event.SimpleDate.class))
.create();
...と...
public class Event {
@SerializedName("created")
private EventDateTime mCreated;
//@SerializedName("updated")
private EventDateTime mUpdated;
...
@SerializedName("start")
private ConditionalDateTime mStart;
@SerializedName("end")
private ConditionalDateTime mEnd;
public static class ConditionalDateTime {
@SerializedName("dateTime")
private StartEndDateTime mDateTime;
@SerializedName("date")
private SimpleDate mDate;
public SimpleDate getDate() {
return mDate;
}
public StartEndDateTime getDateTime() {
return mDateTime;
}
/**
* If it is an all day event then only date is populated (not DateTime)
* @return
*/
public boolean isAllDayEvent() {
return mDate != null;
}
}
public static class EventDateTime extends Date {
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
}
public static class StartEndDateTime extends Date {
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ");
}
public static class SimpleDate extends java.util.Date {
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
}
}
非常に素晴らしいソリューションを異なるフォーマットを登録します、そしてはるかに拡張可能です。 –
私はこれが大好きですが、SimpleDateFormatsとスレッドの安全性に問題があるかどうかは疑問です。もしそうなら、代わりにフォーマット文字列を保存し、DateDeserializer.deserialize()の各呼び出しで新しいSimpleDateFormatを作成するのが最も簡単でしょうか? –