diff --git a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java index 8d9881a0..c2a26da4 100644 --- a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java +++ b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java @@ -47,7 +47,6 @@ final class DefaultTypeAdapters { private static final DefaultTimestampDeserializer TIMESTAMP_DESERIALIZER = new DefaultTimestampDeserializer(); - private static final CharacterTypeAdapter CHARACTER_TYPE_ADAPTER = new CharacterTypeAdapter(); private static final NumberTypeAdapter NUMBER_TYPE_ADAPTER = new NumberTypeAdapter(); private static final GregorianCalendarTypeAdapter GREGORIAN_CALENDAR_TYPE_ADAPTER = @@ -74,9 +73,6 @@ final class DefaultTypeAdapters { map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); - // Add primitive serializers - map.register(char.class, CHARACTER_TYPE_ADAPTER, true); - map.register(Character.class, CHARACTER_TYPE_ADAPTER, true); map.register(Number.class, NUMBER_TYPE_ADAPTER, true); map.makeUnmodifiable(); @@ -93,9 +89,6 @@ final class DefaultTypeAdapters { map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER, true); - // Add primitive deserializers - map.register(char.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER), true); - map.register(Character.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER), true); map.register(Number.class, NUMBER_TYPE_ADAPTER, true); map.makeUnmodifiable(); @@ -331,21 +324,4 @@ final class DefaultTypeAdapters { return NumberTypeAdapter.class.getSimpleName(); } } - - private static final class CharacterTypeAdapter - implements JsonSerializer, JsonDeserializer { - public JsonElement serialize(Character src, Type typeOfSrc, JsonSerializationContext context) { - return new JsonPrimitive(src); - } - - public Character deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { - return json.getAsCharacter(); - } - - @Override - public String toString() { - return CharacterTypeAdapter.class.getSimpleName(); - } - } } diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index b0c5c85d..b53f71a1 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -236,6 +236,7 @@ public final class Gson { floatAdapter(serializeSpecialFloatingPointValues))) .factory(new ExcludedTypeAdapterFactory( serializationExclusionStrategy, deserializationExclusionStrategy)) + .factory(TypeAdapters.CHARACTER_FACTORY) .factory(TypeAdapters.STRING_FACTORY) .factory(TypeAdapters.STRING_BUILDER_FACTORY) .factory(TypeAdapters.STRING_BUFFER_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 90c1f85f..a883d767 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 @@ -231,6 +231,24 @@ public final class TypeAdapters { public static final TypeAdapter.Factory DOUBLE_FACTORY = newFactory(double.class, Double.class, DOUBLE); + public static final TypeAdapter CHARACTER = new TypeAdapter() { + @Override + public Character read(JsonReader reader) throws IOException { + if (reader.peek() == JsonToken.NULL) { + reader.nextNull(); // TODO: does this belong here? + return null; + } + return reader.nextString().charAt(0); + } + @Override + public void write(JsonWriter writer, Character value) throws IOException { + writer.value(String.valueOf(value)); + } + }; + + public static final TypeAdapter.Factory CHARACTER_FACTORY + = newFactory(char.class, Character.class, CHARACTER); + public static final TypeAdapter STRING = new TypeAdapter() { @Override public String read(JsonReader reader) throws IOException {