diff --git a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java index 53435c09..8249ff63 100644 --- a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java +++ b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java @@ -71,6 +71,7 @@ final class DefaultTypeAdapters { private static final FloatTypeAdapter FLOAT_TYPE_ADAPTER = new FloatTypeAdapter(); private static final IntegerTypeAdapter INTEGER_TYPE_ADAPTER = new IntegerTypeAdapter(); private static final LongTypeAdapter LONG_TYPE_ADAPTER = new LongTypeAdapter(); + private static final NumberTypeAdapter NUMBER_TYPE_ADAPTER = new NumberTypeAdapter(); private static final ShortTypeAdapter SHORT_TYPE_ADAPTER = new ShortTypeAdapter(); private static final StringTypeAdapter STRING_TYPE_ADAPTER = new StringTypeAdapter(); @@ -116,6 +117,7 @@ final class DefaultTypeAdapters { map.register(int.class, INTEGER_TYPE_ADAPTER); map.register(Long.class, LONG_TYPE_ADAPTER); map.register(long.class, LONG_TYPE_ADAPTER); + map.register(Number.class, NUMBER_TYPE_ADAPTER); map.register(Short.class, SHORT_TYPE_ADAPTER); map.register(short.class, SHORT_TYPE_ADAPTER); map.register(String.class, STRING_TYPE_ADAPTER); @@ -152,6 +154,7 @@ final class DefaultTypeAdapters { map.register(int.class, wrapDeserializer(INTEGER_TYPE_ADAPTER)); map.register(Long.class, wrapDeserializer(LONG_TYPE_ADAPTER)); map.register(long.class, wrapDeserializer(LONG_TYPE_ADAPTER)); + map.register(Number.class, wrapDeserializer(NUMBER_TYPE_ADAPTER)); map.register(Short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); map.register(short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); map.register(String.class, wrapDeserializer(STRING_TYPE_ADAPTER)); @@ -510,6 +513,23 @@ final class DefaultTypeAdapters { return BigIntegerTypeAdapter.class.getSimpleName(); } } + + private static class NumberTypeAdapter + implements JsonSerializer, JsonDeserializer { + public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src); + } + + public Number deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return json.getAsNumber(); + } + + @Override + public String toString() { + return LongTypeAdapter.class.getSimpleName(); + } + } private static class LongTypeAdapter implements InstanceCreator, JsonSerializer, JsonDeserializer { diff --git a/gson/src/test/java/com/google/gson/functional/PrimitiveTest.java b/gson/src/test/java/com/google/gson/functional/PrimitiveTest.java index 1cc0e295..ef080ed4 100644 --- a/gson/src/test/java/com/google/gson/functional/PrimitiveTest.java +++ b/gson/src/test/java/com/google/gson/functional/PrimitiveTest.java @@ -142,6 +142,27 @@ public class PrimitiveTest extends TestCase { value = gson.fromJson("[true]", boolean.class); assertEquals(true, value); } + + public void testNumberSerialization() { + Number expected = 1L; + String json = gson.toJson(expected); + assertEquals(expected.toString(), json); + + json = gson.toJson(expected, Number.class); + assertEquals(expected.toString(), json); + } + + public void testNumberDeserialization() { + String json = "1"; + Number expected = new Integer(json); + Number actual = gson.fromJson(json, Number.class); + assertEquals(expected.intValue(), actual.intValue()); + + json = String.valueOf(Long.MAX_VALUE); + expected = new Long(json); + actual = gson.fromJson(json, Number.class); + assertEquals(expected.longValue(), actual.longValue()); + } public void testPrimitiveDoubleAutoboxedSerialization() { assertEquals("-122.08234335", gson.toJson(-122.08234335));