diff --git a/src/main/java/com/alibaba/fastjson/TypeReference.java b/src/main/java/com/alibaba/fastjson/TypeReference.java index 2adf90d0a..bf21cb5d7 100644 --- a/src/main/java/com/alibaba/fastjson/TypeReference.java +++ b/src/main/java/com/alibaba/fastjson/TypeReference.java @@ -122,7 +122,7 @@ public class TypeReference { // 如果有多层泛型且该泛型已经注明实现的情况下,判断该泛型下一层是否还有泛型 if(argTypes[i] instanceof ParameterizedType) { - return handlerParameterizedType((ParameterizedType) argTypes[i], actualTypeArguments, actualIndex); + argTypes[i] = handlerParameterizedType((ParameterizedType) argTypes[i], actualTypeArguments, actualIndex); } } diff --git a/src/test/java/com/alibaba/json/bvt/issue_3300/Issue3448.java b/src/test/java/com/alibaba/json/bvt/issue_3300/Issue3448.java new file mode 100644 index 000000000..1f055a844 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/issue_3300/Issue3448.java @@ -0,0 +1,43 @@ +package com.alibaba.json.bvt.issue_3300; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; + +import junit.framework.TestCase; +import org.junit.Test; + +/** + * @author yumin.pym + */ +public class Issue3448 extends TestCase { + public static class SelfTypeReference { + + } + + @Test + public void test() { + List>> list = new ArrayList<>(4); + list.add(Collections.singletonMap("key1", Collections.singletonList("item"))); + String text = JSON.toJSONString(list); + System.out.println("text = " + text); + + List>> result = parseObject(text, + new SelfTypeReference>>() {}); + System.out.println("result = " + result); + TestCase.assertTrue(result.get(0) instanceof Map); + TestCase.assertTrue(result.get(0).get("key1").get(0) instanceof String); + } + + public List parseObject(String text, SelfTypeReference selfTypeReference) { + Type genericSuperclass = selfTypeReference.getClass().getGenericSuperclass(); + Type[] actualTypeArguments = ((ParameterizedType)genericSuperclass).getActualTypeArguments(); + return JSON.parseObject(text, new TypeReference>(actualTypeArguments) {}); + } +}