diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java index 3edc8de8b9..fa578a767a 100644 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java @@ -64,7 +64,7 @@ public void parseField(DefaultJSONParser parser, Object object, Type objectType, } if (fieldType != objectType) { fieldType = FieldInfo.getFieldType(this.clazz, objectType, fieldType); - if (fieldValueDeserilizer == null) { + if (fieldValueDeserilizer instanceof JavaObjectDeserializer) { fieldValueDeserilizer = parser.getConfig().getDeserializer(fieldType); } } diff --git a/src/test/java/com/alibaba/json/bvt/issue_3800/Issue3810.java b/src/test/java/com/alibaba/json/bvt/issue_3800/Issue3810.java new file mode 100644 index 0000000000..1662694338 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/issue_3800/Issue3810.java @@ -0,0 +1,40 @@ +package com.alibaba.json.bvt.issue_3800; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.util.ParameterizedTypeImpl; +import junit.framework.TestCase; +import lombok.Data; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * https://github.com/alibaba/fastjson/issues/3810 + * + * @author hnyyghk + * @date 2021/06/30 18:40 + */ +public class Issue3810 extends TestCase { + @Data + static class TestA { + T a; + } + + @Data + static class TestB { + String b; + } + + private final static String json = "{\"a\":[{\"b\":\"b\"}]}"; + + public void test_for_issue() throws Exception { + ParameterizedTypeImpl inner = new ParameterizedTypeImpl(new Type[]{TestB.class}, List.class, List.class); + ParameterizedTypeImpl outer = new ParameterizedTypeImpl(new Type[]{inner}, TestA.class, TestA.class); + JSONObject jo = JSONObject.parseObject(json); + TestA> ret = jo.toJavaObject(outer); + + assertEquals(ArrayList.class.getName(), ret.getA().getClass().getName()); + assertEquals(TestB.class.getName(), ret.getA().get(0).getClass().getName()); + } +} \ No newline at end of file