diff --git a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java index a42f9c31..f90a43cb 100644 --- a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java +++ b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java @@ -22,9 +22,7 @@ import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.Date; -import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; @@ -40,8 +38,6 @@ import com.google.gson.internal.ParameterizedTypeHandlerMap; final class DefaultTypeAdapters { private static final DefaultDateTypeAdapter DATE_TYPE_ADAPTER = new DefaultDateTypeAdapter(); - private static final DefaultJavaSqlDateTypeAdapter JAVA_SQL_DATE_TYPE_ADAPTER = - new DefaultJavaSqlDateTypeAdapter(); private static final DefaultTimeTypeAdapter TIME_TYPE_ADAPTER = new DefaultTimeTypeAdapter(); private static final DefaultTimestampDeserializer TIMESTAMP_DESERIALIZER = @@ -62,7 +58,6 @@ final class DefaultTypeAdapters { new ParameterizedTypeHandlerMap>(); map.register(Date.class, 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(Time.class, TIME_TYPE_ADAPTER, true); @@ -74,7 +69,6 @@ final class DefaultTypeAdapters { ParameterizedTypeHandlerMap> map = new ParameterizedTypeHandlerMap>(); map.register(Date.class, wrapDeserializer(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(Time.class, wrapDeserializer(TIME_TYPE_ADAPTER), true); @@ -181,37 +175,6 @@ final class DefaultTypeAdapters { } } - static final class DefaultJavaSqlDateTypeAdapter implements JsonSerializer, - JsonDeserializer { - private final DateFormat format; - DefaultJavaSqlDateTypeAdapter() { - this.format = new SimpleDateFormat("MMM d, yyyy"); - } - - public JsonElement serialize(java.sql.Date src, Type typeOfSrc, - JsonSerializationContext context) { - synchronized (format) { - String dateFormatAsString = format.format(src); - return new JsonPrimitive(dateFormatAsString); - } - } - - public java.sql.Date deserialize(JsonElement json, Type typeOfT, - JsonDeserializationContext context) throws JsonParseException { - if (!(json instanceof JsonPrimitive)) { - throw new JsonParseException("The date should be a string value"); - } - try { - synchronized (format) { - Date date = format.parse(json.getAsString()); - return new java.sql.Date(date.getTime()); - } - } catch (ParseException e) { - throw new JsonSyntaxException(e); - } - } - } - static final class DefaultTimestampDeserializer implements JsonDeserializer { public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 70f65356..e3b9a9b4 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -255,6 +255,7 @@ public final class Gson { .factory(new GsonToMiniGsonTypeAdapterFactory(serializers, deserializers, new JsonDeserializationContext(this), new JsonSerializationContext(this), serializeNulls )) + .factory(TypeAdapters.SQL_DATE_FACTORY) .factory(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization)) .factory(ArrayTypeAdapter.FACTORY) .factory(TypeAdapters.ENUM_FACTORY) diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index a2d6779d..1074880a 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -21,8 +21,12 @@ import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.BitSet; import java.util.Calendar; +import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.StringTokenizer; @@ -407,6 +411,27 @@ public final class TypeAdapters { public static final TypeAdapter.Factory UUID_FACTORY = newFactory(UUID.class, UUID); + public static final TypeAdapter SQL_DATE = new TypeAdapter() { + private final DateFormat format = new SimpleDateFormat("MMM d, yyyy"); + @Override + public java.sql.Date read(JsonReader reader) throws IOException { + try { + synchronized (format) { + Date date = format.parse(reader.nextString()); + return new java.sql.Date(date.getTime()); + } + } catch (ParseException e) { + throw new JsonSyntaxException(e); + } + } + @Override + public void write(JsonWriter writer, java.sql.Date value) throws IOException { + writer.value(format.format(value)); + } + }; + + public static final TypeAdapter.Factory SQL_DATE_FACTORY = newFactory(java.sql.Date.class, SQL_DATE); + public static final TypeAdapter CALENDAR = new TypeAdapter() { private static final String YEAR = "year"; private static final String MONTH = "month";