diff --git a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java index 9e088f35..1c184461 100644 --- a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java +++ b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java @@ -65,9 +65,7 @@ final class DefaultTypeAdapters { @SuppressWarnings("unchecked") private static final EnumTypeAdapter ENUM_TYPE_ADAPTER = new EnumTypeAdapter(); private static final BitSetTypeAdapter BIT_SET_ADAPTER = new BitSetTypeAdapter(); - private static final DefaultInetAddressAdapter INET_ADDRESS_ADAPTER = - new DefaultInetAddressAdapter(); - private static final CollectionTypeAdapter COLLECTION_TYPE_ADAPTER = new CollectionTypeAdapter(); + private static final CollectionTypeAdapter COLLECTION_TYPE_ADAPTER = new CollectionTypeAdapter(); private static final MapTypeAdapter MAP_TYPE_ADAPTER = new MapTypeAdapter(); private static final ByteTypeAdapter BYTE_TYPE_ADAPTER = new ByteTypeAdapter(); @@ -118,7 +116,6 @@ final class DefaultTypeAdapters { ParameterizedTypeHandlerMap> map = new ParameterizedTypeHandlerMap>(); map.registerForTypeHierarchy(Enum.class, ENUM_TYPE_ADAPTER, true); - map.registerForTypeHierarchy(InetAddress.class, INET_ADDRESS_ADAPTER, true); map.registerForTypeHierarchy(Collection.class, COLLECTION_TYPE_ADAPTER, true); map.registerForTypeHierarchy(Map.class, MAP_TYPE_ADAPTER, true); map.makeUnmodifiable(); @@ -152,7 +149,6 @@ final class DefaultTypeAdapters { ParameterizedTypeHandlerMap> map = new ParameterizedTypeHandlerMap>(); map.registerForTypeHierarchy(Enum.class, wrapDeserializer(ENUM_TYPE_ADAPTER), true); - map.registerForTypeHierarchy(InetAddress.class, wrapDeserializer(INET_ADDRESS_ADAPTER), true); map.registerForTypeHierarchy(Collection.class, wrapDeserializer(COLLECTION_TYPE_ADAPTER), true); map.registerForTypeHierarchy(Map.class, wrapDeserializer(MAP_TYPE_ADAPTER), true); map.makeUnmodifiable(); @@ -438,24 +434,6 @@ final class DefaultTypeAdapters { } } - static final class DefaultInetAddressAdapter - implements JsonDeserializer, JsonSerializer { - - public InetAddress deserialize(JsonElement json, Type typeOfT, - JsonDeserializationContext context) throws JsonParseException { - try { - return InetAddress.getByName(json.getAsString()); - } catch (UnknownHostException e) { - throw new JsonParseException(e); - } - } - - public JsonElement serialize(InetAddress src, Type typeOfSrc, - JsonSerializationContext context) { - return new JsonPrimitive(src.getHostAddress()); - } - } - @SuppressWarnings("unchecked") private static final class EnumTypeAdapter> implements JsonSerializer, JsonDeserializer { diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 467fb7b7..a00cde00 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -243,6 +243,7 @@ public final class Gson { .factory(TypeAdapters.URI_FACTORY) .factory(TypeAdapters.UUID_FACTORY) .factory(TypeAdapters.LOCALE_FACTORY) + .factory(TypeAdapters.INET_ADDRESS_FACTORY) .typeAdapter(BigDecimal.class, new BigDecimalTypeAdapter()) .typeAdapter(BigInteger.class, new BigIntegerTypeAdapter()) .factory(excludedTypeFactory) diff --git a/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java b/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java index 99e279cc..537ad896 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java +++ b/gson/src/main/java/com/google/gson/internal/bind/MiniGson.java @@ -166,8 +166,8 @@ public final class MiniGson { return this; } - public Builder typeHierarchyAdapter(TypeToken type, TypeAdapter typeAdapter) { - factories.add(TypeAdapters.newTypeHierarchyFactory(type, typeAdapter)); + public Builder typeHierarchyAdapter(Class clazz, TypeAdapter typeAdapter) { + factories.add(TypeAdapters.newTypeHierarchyFactory(clazz, typeAdapter)); return this; } diff --git a/gson/src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java b/gson/src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java index 5c55f699..3e395cdb 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java +++ b/gson/src/main/java/com/google/gson/internal/bind/ObjectTypeAdapter.java @@ -33,7 +33,7 @@ import java.util.Map; public final class ObjectTypeAdapter extends TypeAdapter { public static final Factory FACTORY = new Factory() { @SuppressWarnings("unchecked") - @Override public TypeAdapter create(MiniGson context, TypeToken type) { + public TypeAdapter create(MiniGson context, TypeToken type) { if (type.getRawType() == Object.class) { return (TypeAdapter) new ObjectTypeAdapter(context); } 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 bf996f80..ea4a5f9b 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 @@ -16,11 +16,8 @@ package com.google.gson.internal.bind; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; -import com.google.gson.stream.JsonWriter; import java.io.IOException; +import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -28,6 +25,11 @@ import java.util.Locale; import java.util.StringTokenizer; import java.util.UUID; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + /** * Type adapters for basic types. */ @@ -173,6 +175,18 @@ public final class TypeAdapters { public static final TypeAdapter.Factory URI_FACTORY = newFactory(URI.class, URI); + public static final TypeAdapter INET_ADDRESS = new TypeAdapter() { + public InetAddress read(JsonReader reader) throws IOException { + return InetAddress.getByName(reader.nextString()); + } + public void write(JsonWriter writer, InetAddress value) throws IOException { + writer.value(value.getHostAddress()); + } + }; + + public static final TypeAdapter.Factory INET_ADDRESS_FACTORY = + newTypeHierarchyFactory(InetAddress.class, INET_ADDRESS); + public static final TypeAdapter UUID = new TypeAdapter() { public UUID read(JsonReader reader) throws IOException { return java.util.UUID.fromString(reader.nextString()); @@ -257,11 +271,10 @@ public final class TypeAdapters { } public static TypeAdapter.Factory newTypeHierarchyFactory( - TypeToken type, TypeAdapter typeAdapter) { + final Class clazz, final TypeAdapter typeAdapter) { return new TypeAdapter.Factory() { public TypeAdapter create(MiniGson context, TypeToken typeToken) { - // TODO: use Inder's TypeHierarchyAdapter here - throw new UnsupportedOperationException(); + return clazz.isAssignableFrom(typeToken.getRawType()) ? (TypeAdapter) typeAdapter : null; } }; }