Added default serializer/deserializer for "Number"

This commit is contained in:
Joel Leitch 2008-11-18 20:05:02 +00:00
parent 788d2bfbbb
commit 628a2c5b86
2 changed files with 41 additions and 0 deletions

View File

@ -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<Number>, JsonDeserializer<Number> {
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<Long>, JsonSerializer<Long>, JsonDeserializer<Long> {

View File

@ -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));