diff --git a/src/main/java/com/jsoniter/Codegen.java b/src/main/java/com/jsoniter/Codegen.java index 7d82c07a..c1fa2edc 100644 --- a/src/main/java/com/jsoniter/Codegen.java +++ b/src/main/java/com/jsoniter/Codegen.java @@ -8,6 +8,7 @@ import java.io.OutputStreamWriter; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; import java.util.*; class Codegen { @@ -127,6 +128,8 @@ private static Type chooseImpl(Type type) { ParameterizedType pType = (ParameterizedType) type; clazz = (Class) pType.getRawType(); typeArgs = pType.getActualTypeArguments(); + } else if (type instanceof WildcardType) { + clazz = Object.class; } else { clazz = (Class) type; } diff --git a/src/main/java/com/jsoniter/spi/ClassInfo.java b/src/main/java/com/jsoniter/spi/ClassInfo.java index dcd9a28a..e85f7e38 100644 --- a/src/main/java/com/jsoniter/spi/ClassInfo.java +++ b/src/main/java/com/jsoniter/spi/ClassInfo.java @@ -2,6 +2,7 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; public class ClassInfo { @@ -15,6 +16,9 @@ public ClassInfo(Type type) { ParameterizedType pType = (ParameterizedType) type; clazz = (Class) pType.getRawType(); typeArgs = pType.getActualTypeArguments(); + } else if (type instanceof WildcardType) { + clazz = Object.class; + typeArgs = new Type[0]; } else { clazz = (Class) type; typeArgs = new Type[0]; diff --git a/src/main/java/com/jsoniter/spi/TypeLiteral.java b/src/main/java/com/jsoniter/spi/TypeLiteral.java index 2f00901a..8f9f5423 100644 --- a/src/main/java/com/jsoniter/spi/TypeLiteral.java +++ b/src/main/java/com/jsoniter/spi/TypeLiteral.java @@ -5,6 +5,7 @@ import java.lang.reflect.GenericArrayType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; import java.math.BigDecimal; import java.math.BigInteger; import java.util.HashMap; @@ -120,6 +121,8 @@ private static String generateCacheKey(Type type, String prefix) { Type compType = gaType.getGenericComponentType(); decoderClassName.append(formatTypeWithoutSpecialCharacter(compType)); decoderClassName.append("_array"); + } else if (type instanceof WildcardType) { + decoderClassName.append("_wildcard"); } else { throw new UnsupportedOperationException("do not know how to handle: " + type); } @@ -144,6 +147,9 @@ private static String formatTypeWithoutSpecialCharacter(Type type) { GenericArrayType gaType = (GenericArrayType) type; return formatTypeWithoutSpecialCharacter(gaType.getGenericComponentType()) + "_array"; } + if (type instanceof WildcardType) { + return type.toString(); + } throw new JsonException("unsupported type: " + type + ", of class " + type.getClass()); } diff --git a/src/test/java/com/jsoniter/TestGenerics.java b/src/test/java/com/jsoniter/TestGenerics.java index 1f9d9201..5f3d4077 100644 --- a/src/test/java/com/jsoniter/TestGenerics.java +++ b/src/test/java/com/jsoniter/TestGenerics.java @@ -1,6 +1,10 @@ package com.jsoniter; -import com.jsoniter.spi.*; +import com.jsoniter.output.JsonStream; +import com.jsoniter.spi.Binding; +import com.jsoniter.spi.ClassDescriptor; +import com.jsoniter.spi.ClassInfo; +import com.jsoniter.spi.TypeLiteral; import junit.framework.TestCase; import java.io.IOException; @@ -132,4 +136,12 @@ public void test_issue_103() { assertEquals(User.class, res.results.getClass()); } + public static class TestObject7 { + public List field; + } + + public void test_wildcard() throws IOException { + TestObject7 obj = JsonIterator.deserialize("{\"field\":[1]}", TestObject7.class); + assertEquals(Double.valueOf(1), obj.field.get(0)); + } } diff --git a/src/test/java/com/jsoniter/output/TestGenerics.java b/src/test/java/com/jsoniter/output/TestGenerics.java index 10e9b4f4..36772484 100644 --- a/src/test/java/com/jsoniter/output/TestGenerics.java +++ b/src/test/java/com/jsoniter/output/TestGenerics.java @@ -4,6 +4,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class TestGenerics extends TestCase { static { @@ -34,4 +36,16 @@ public void test_inherited_getter_is_not_duplicate() throws IOException { stream.close(); assertEquals("{\"hello\":0}", baos.toString()); } + + public static class TestObject7 { + public List field; + } + + public void test_wildcard() throws IOException { + TestObject7 obj = new TestObject7(); + ArrayList list = new ArrayList(); + list.add(1); + obj.field = list; + assertEquals("{\"field\":[1]}", JsonStream.serialize(obj)); + } }