From f83fee8d1e6a10e93337ec5b2d36bb20b508511f Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 16 Jan 2017 21:42:29 +0800 Subject: [PATCH] bug fixed for WildcardType extends Generic Type. issue #998 --- .../ArrayListTypeFieldDeserializer.java | 11 +++++++- .../com/alibaba/json/bvt/bug/Issue998.java | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/json/bvt/bug/Issue998.java diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/ArrayListTypeFieldDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/ArrayListTypeFieldDeserializer.java index efce710f8c..0636be4e07 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/ArrayListTypeFieldDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/ArrayListTypeFieldDeserializer.java @@ -3,6 +3,7 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; import java.util.ArrayList; import java.util.Collection; import java.util.Map; @@ -27,7 +28,15 @@ public ArrayListTypeFieldDeserializer(ParserConfig mapping, Class clazz, Fiel Type fieldType = fieldInfo.fieldType; if (fieldType instanceof ParameterizedType) { - this.itemType = ((ParameterizedType) fieldInfo.fieldType).getActualTypeArguments()[0]; + Type argType = ((ParameterizedType) fieldInfo.fieldType).getActualTypeArguments()[0]; + if (argType instanceof WildcardType) { + WildcardType wildcardType = (WildcardType) argType; + Type[] upperBounds = wildcardType.getUpperBounds(); + if (upperBounds.length == 1) { + argType = upperBounds[0]; + } + } + this.itemType = argType; } else { this.itemType = Object.class; } diff --git a/src/test/java/com/alibaba/json/bvt/bug/Issue998.java b/src/test/java/com/alibaba/json/bvt/bug/Issue998.java new file mode 100644 index 0000000000..e744fd0c11 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/bug/Issue998.java @@ -0,0 +1,28 @@ +package com.alibaba.json.bvt.bug; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import junit.framework.TestCase; + +import java.util.List; + +/** + * Created by wenshao on 16/01/2017. + */ +public class Issue998 extends TestCase { + public void test_for_issue() throws Exception { + Model model = JSON.parseObject("{\"items\":[{\"id\":123}]}", Model.class); + assertNotNull(model); + assertNotNull(model.items); + assertEquals(1, model.items.size()); + assertEquals(123, model.items.get(0).id); + } + + public static class Model { + public List items; + } + + public static class Item { + public int id; + } +}