Converted Calendar/GregorianCalendar type adapters to the new style.
This commit is contained in:
parent
4402240294
commit
d20df34b8b
@ -47,9 +47,6 @@ final class DefaultTypeAdapters {
|
|||||||
private static final DefaultTimestampDeserializer TIMESTAMP_DESERIALIZER =
|
private static final DefaultTimestampDeserializer TIMESTAMP_DESERIALIZER =
|
||||||
new DefaultTimestampDeserializer();
|
new DefaultTimestampDeserializer();
|
||||||
|
|
||||||
private static final GregorianCalendarTypeAdapter GREGORIAN_CALENDAR_TYPE_ADAPTER =
|
|
||||||
new GregorianCalendarTypeAdapter();
|
|
||||||
|
|
||||||
// The constants DEFAULT_SERIALIZERS, DEFAULT_DESERIALIZERS, and DEFAULT_INSTANCE_CREATORS
|
// The constants DEFAULT_SERIALIZERS, DEFAULT_DESERIALIZERS, and DEFAULT_INSTANCE_CREATORS
|
||||||
// must be defined after the constants for the type adapters. Otherwise, the type adapter
|
// must be defined after the constants for the type adapters. Otherwise, the type adapter
|
||||||
// constants will appear as nulls.
|
// constants will appear as nulls.
|
||||||
@ -68,8 +65,6 @@ final class DefaultTypeAdapters {
|
|||||||
map.register(java.sql.Date.class, JAVA_SQL_DATE_TYPE_ADAPTER, true);
|
map.register(java.sql.Date.class, JAVA_SQL_DATE_TYPE_ADAPTER, true);
|
||||||
map.register(Timestamp.class, DATE_TYPE_ADAPTER, true);
|
map.register(Timestamp.class, DATE_TYPE_ADAPTER, true);
|
||||||
map.register(Time.class, TIME_TYPE_ADAPTER, true);
|
map.register(Time.class, TIME_TYPE_ADAPTER, true);
|
||||||
map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
|
|
||||||
map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
|
|
||||||
|
|
||||||
map.makeUnmodifiable();
|
map.makeUnmodifiable();
|
||||||
return map;
|
return map;
|
||||||
@ -82,8 +77,6 @@ final class DefaultTypeAdapters {
|
|||||||
map.register(java.sql.Date.class, wrapDeserializer(JAVA_SQL_DATE_TYPE_ADAPTER), true);
|
map.register(java.sql.Date.class, wrapDeserializer(JAVA_SQL_DATE_TYPE_ADAPTER), true);
|
||||||
map.register(Timestamp.class, wrapDeserializer(TIMESTAMP_DESERIALIZER), true);
|
map.register(Timestamp.class, wrapDeserializer(TIMESTAMP_DESERIALIZER), true);
|
||||||
map.register(Time.class, wrapDeserializer(TIME_TYPE_ADAPTER), true);
|
map.register(Time.class, wrapDeserializer(TIME_TYPE_ADAPTER), true);
|
||||||
map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
|
|
||||||
map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true);
|
|
||||||
|
|
||||||
map.makeUnmodifiable();
|
map.makeUnmodifiable();
|
||||||
return map;
|
return map;
|
||||||
@ -253,44 +246,4 @@ final class DefaultTypeAdapters {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class GregorianCalendarTypeAdapter
|
|
||||||
implements JsonSerializer<GregorianCalendar>, JsonDeserializer<GregorianCalendar> {
|
|
||||||
|
|
||||||
private static final String YEAR = "year";
|
|
||||||
private static final String MONTH = "month";
|
|
||||||
private static final String DAY_OF_MONTH = "dayOfMonth";
|
|
||||||
private static final String HOUR_OF_DAY = "hourOfDay";
|
|
||||||
private static final String MINUTE = "minute";
|
|
||||||
private static final String SECOND = "second";
|
|
||||||
|
|
||||||
public JsonElement serialize(GregorianCalendar src, Type typeOfSrc,
|
|
||||||
JsonSerializationContext context) {
|
|
||||||
JsonObject obj = new JsonObject();
|
|
||||||
obj.addProperty(YEAR, src.get(Calendar.YEAR));
|
|
||||||
obj.addProperty(MONTH, src.get(Calendar.MONTH));
|
|
||||||
obj.addProperty(DAY_OF_MONTH, src.get(Calendar.DAY_OF_MONTH));
|
|
||||||
obj.addProperty(HOUR_OF_DAY, src.get(Calendar.HOUR_OF_DAY));
|
|
||||||
obj.addProperty(MINUTE, src.get(Calendar.MINUTE));
|
|
||||||
obj.addProperty(SECOND, src.get(Calendar.SECOND));
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
public GregorianCalendar deserialize(JsonElement json, Type typeOfT,
|
|
||||||
JsonDeserializationContext context) throws JsonParseException {
|
|
||||||
JsonObject obj = json.getAsJsonObject();
|
|
||||||
int year = obj.get(YEAR).getAsInt();
|
|
||||||
int month = obj.get(MONTH).getAsInt();
|
|
||||||
int dayOfMonth = obj.get(DAY_OF_MONTH).getAsInt();
|
|
||||||
int hourOfDay = obj.get(HOUR_OF_DAY).getAsInt();
|
|
||||||
int minute = obj.get(MINUTE).getAsInt();
|
|
||||||
int second = obj.get(SECOND).getAsInt();
|
|
||||||
return new GregorianCalendar(year, month, dayOfMonth, hourOfDay, minute, second);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return GregorianCalendarTypeAdapter.class.getSimpleName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -247,6 +247,7 @@ public final class Gson {
|
|||||||
.factory(TypeAdapters.LOCALE_FACTORY)
|
.factory(TypeAdapters.LOCALE_FACTORY)
|
||||||
.factory(TypeAdapters.INET_ADDRESS_FACTORY)
|
.factory(TypeAdapters.INET_ADDRESS_FACTORY)
|
||||||
.factory(TypeAdapters.BIT_SET_FACTORY)
|
.factory(TypeAdapters.BIT_SET_FACTORY)
|
||||||
|
.factory(TypeAdapters.CALENDAR_FACTORY)
|
||||||
.typeAdapter(BigDecimal.class, new BigDecimalTypeAdapter())
|
.typeAdapter(BigDecimal.class, new BigDecimalTypeAdapter())
|
||||||
.typeAdapter(BigInteger.class, new BigIntegerTypeAdapter())
|
.typeAdapter(BigInteger.class, new BigIntegerTypeAdapter())
|
||||||
.factory(new CollectionTypeAdapterFactory(constructorConstructor))
|
.factory(new CollectionTypeAdapterFactory(constructorConstructor))
|
||||||
|
@ -22,6 +22,8 @@ import java.net.URI;
|
|||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -405,6 +407,66 @@ public final class TypeAdapters {
|
|||||||
|
|
||||||
public static final TypeAdapter.Factory UUID_FACTORY = newFactory(UUID.class, UUID);
|
public static final TypeAdapter.Factory UUID_FACTORY = newFactory(UUID.class, UUID);
|
||||||
|
|
||||||
|
public static final TypeAdapter<Calendar> CALENDAR = new TypeAdapter<Calendar>() {
|
||||||
|
private static final String YEAR = "year";
|
||||||
|
private static final String MONTH = "month";
|
||||||
|
private static final String DAY_OF_MONTH = "dayOfMonth";
|
||||||
|
private static final String HOUR_OF_DAY = "hourOfDay";
|
||||||
|
private static final String MINUTE = "minute";
|
||||||
|
private static final String SECOND = "second";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Calendar read(JsonReader reader) throws IOException {
|
||||||
|
reader.beginObject();
|
||||||
|
int year = 0;
|
||||||
|
int month = 0;
|
||||||
|
int dayOfMonth = 0;
|
||||||
|
int hourOfDay = 0;
|
||||||
|
int minute = 0;
|
||||||
|
int second = 0;
|
||||||
|
while (reader.peek() != JsonToken.END_OBJECT) {
|
||||||
|
String name = reader.nextName();
|
||||||
|
int value = reader.nextInt();
|
||||||
|
if (YEAR.equals(name)) {
|
||||||
|
year = value;
|
||||||
|
} else if (MONTH.equals(name)) {
|
||||||
|
month = value;
|
||||||
|
} else if (DAY_OF_MONTH.equals(name)) {
|
||||||
|
dayOfMonth = value;
|
||||||
|
} else if (HOUR_OF_DAY.equals(name)) {
|
||||||
|
hourOfDay = value;
|
||||||
|
} else if (MINUTE.equals(name)) {
|
||||||
|
minute = value;
|
||||||
|
} else if (SECOND.equals(name)) {
|
||||||
|
second = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.endObject();
|
||||||
|
return new GregorianCalendar(year, month, dayOfMonth, hourOfDay, minute, second);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(JsonWriter writer, Calendar value) throws IOException {
|
||||||
|
writer.beginObject();
|
||||||
|
writer.name(YEAR);
|
||||||
|
writer.value(value.get(Calendar.YEAR));
|
||||||
|
writer.name(MONTH);
|
||||||
|
writer.value(value.get(Calendar.MONTH));
|
||||||
|
writer.name(DAY_OF_MONTH);
|
||||||
|
writer.value(value.get(Calendar.DAY_OF_MONTH));
|
||||||
|
writer.name(HOUR_OF_DAY);
|
||||||
|
writer.value(value.get(Calendar.HOUR_OF_DAY));
|
||||||
|
writer.name(MINUTE);
|
||||||
|
writer.value(value.get(Calendar.MINUTE));
|
||||||
|
writer.name(SECOND);
|
||||||
|
writer.value(value.get(Calendar.SECOND));
|
||||||
|
writer.endObject();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static final TypeAdapter.Factory CALENDAR_FACTORY =
|
||||||
|
newFactoryForMultipleTypes(Calendar.class, GregorianCalendar.class, CALENDAR);
|
||||||
|
|
||||||
public static final TypeAdapter<Locale> LOCALE = new TypeAdapter<Locale>() {
|
public static final TypeAdapter<Locale> LOCALE = new TypeAdapter<Locale>() {
|
||||||
@Override
|
@Override
|
||||||
public Locale read(JsonReader reader) throws IOException {
|
public Locale read(JsonReader reader) throws IOException {
|
||||||
@ -501,6 +563,17 @@ public final class TypeAdapters {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <TT> TypeAdapter.Factory newFactoryForMultipleTypes(
|
||||||
|
final Class<TT> base, final Class<? extends TT> sub, final TypeAdapter<? super TT> typeAdapter) {
|
||||||
|
return new TypeAdapter.Factory() {
|
||||||
|
@SuppressWarnings("unchecked") // we use a runtime check to make sure the 'T's equal
|
||||||
|
public <T> TypeAdapter<T> create(MiniGson context, TypeToken<T> typeToken) {
|
||||||
|
Class<? super T> rawType = typeToken.getRawType();
|
||||||
|
return (rawType == base || rawType == sub) ? (TypeAdapter<T>) typeAdapter : null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public static <TT> TypeAdapter.Factory newTypeHierarchyFactory(
|
public static <TT> TypeAdapter.Factory newTypeHierarchyFactory(
|
||||||
final Class<TT> clazz, final TypeAdapter<TT> typeAdapter) {
|
final Class<TT> clazz, final TypeAdapter<TT> typeAdapter) {
|
||||||
return new TypeAdapter.Factory() {
|
return new TypeAdapter.Factory() {
|
||||||
|
Loading…
Reference in New Issue
Block a user