diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java index 8ae46182d..5d938e73a 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java @@ -536,16 +536,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { Map fieldValues) { JSONLexer lexer = parser.lexer; // xxx - FieldDeserializer fieldDeserializer = feildDeserializerMap.get(key); - - if (fieldDeserializer == null) { - for (Map.Entry entry : feildDeserializerMap.entrySet()) { - if (entry.getKey().equalsIgnoreCase(key)) { - fieldDeserializer = entry.getValue(); - break; - } - } - } + FieldDeserializer fieldDeserializer = smartMatch(key); if (fieldDeserializer == null) { parseExtra(parser, object, key); diff --git a/src/main/java/com/alibaba/fastjson/serializer/ObjectArrayCodec.java b/src/main/java/com/alibaba/fastjson/serializer/ObjectArrayCodec.java index 36deb0834..dcbea93c6 100755 --- a/src/main/java/com/alibaba/fastjson/serializer/ObjectArrayCodec.java +++ b/src/main/java/com/alibaba/fastjson/serializer/ObjectArrayCodec.java @@ -168,10 +168,10 @@ public class ObjectArrayCodec implements ObjectSerializer, ObjectDeserializer { componentClass = Object.class; } } else { - componentClass = Object.class; + componentClass = TypeUtils.getClass(typeVar.getBounds()[0]); } } else { - componentClass = (Class) componentType; + componentClass = TypeUtils.getClass(componentType); } } else { Class clazz = (Class) type; diff --git a/src/main/java/com/alibaba/fastjson/util/DeserializeBeanInfo.java b/src/main/java/com/alibaba/fastjson/util/DeserializeBeanInfo.java index a85514d70..5a247f787 100755 --- a/src/main/java/com/alibaba/fastjson/util/DeserializeBeanInfo.java +++ b/src/main/java/com/alibaba/fastjson/util/DeserializeBeanInfo.java @@ -471,7 +471,7 @@ public class DeserializeBeanInfo { continue; } - beanInfo.add(new FieldInfo(propertyName, method, null, clazz, type, annotation)); + beanInfo.add(new FieldInfo(propertyName, method, null, clazz, type, 0, 0, annotation, null)); } } } diff --git a/src/main/java/com/alibaba/fastjson/util/FieldInfo.java b/src/main/java/com/alibaba/fastjson/util/FieldInfo.java index 7463593c8..206eeab59 100755 --- a/src/main/java/com/alibaba/fastjson/util/FieldInfo.java +++ b/src/main/java/com/alibaba/fastjson/util/FieldInfo.java @@ -19,23 +19,19 @@ public class FieldInfo implements Comparable { public final Method method; public final Field field; - private int ordinal = 0; + private int ordinal = 0; public final Class fieldClass; public final Type fieldType; public final Class declaringClass; - private boolean getOnly = false; - private int serialzeFeatures; - private String label = ""; - - private JSONField fieldAnnotation; - private JSONField methodAnnotation; - + private boolean getOnly = false; + private int serialzeFeatures; + private String label = ""; + + private JSONField fieldAnnotation; + private JSONField methodAnnotation; + public final char[] name_chars; - public FieldInfo(String name, Class declaringClass, Class fieldClass, Type fieldType, Field field){ - this(name, declaringClass, fieldClass, fieldType, field, 0, 0); - } - public FieldInfo(String name, Class declaringClass, Class fieldClass, Type fieldType, Field field, int ordinal, int serialzeFeatures){ this.name = name; this.declaringClass = declaringClass; @@ -53,25 +49,6 @@ public class FieldInfo implements Comparable { } } - public FieldInfo(String name, Method method, Field field){ - this(name, method, field, 0, 0); - } - - public FieldInfo(String name, Method method, Field field, int ordinal, int serialzeFeatures){ - this(name, method, field, ordinal, serialzeFeatures, null, null, null); - } - - public FieldInfo(String name, Method method, Field field, int ordinal, int serialzeFeatures, String label, JSONField methodAnnotation, JSONField fieldAnnotation){ - this(name, method, field, null, null, ordinal, serialzeFeatures, methodAnnotation, fieldAnnotation); - if (label != null && label.length() > 0) { - this.label = label; - } - } - - public FieldInfo(String name, Method method, Field field, Class clazz, Type type, JSONField methodAnnotation){ - this(name, method, field, clazz, type, 0, 0, methodAnnotation, null); - } - public FieldInfo(String name, Method method, Field field, Class clazz, Type type, int ordinal, int serialzeFeatures, JSONField fieldAnnotation, JSONField methodAnnotation){ this.name = name; this.method = method; @@ -394,4 +371,11 @@ public class FieldInfo implements Comparable { public int getSerialzeFeatures() { return serialzeFeatures; } + + + public void setLabel(String label) { + if (label != null && label.length() > 0) { + this.label = label; + } + } } diff --git a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java index f143eeeda..862a773d2 100755 --- a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java +++ b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java @@ -1086,8 +1086,9 @@ public class TypeUtils { } } - fieldInfoMap.put(propertyName, new FieldInfo(propertyName, method, null, ordinal, serialzeFeatures, - annotation.label(), annotation, null)); + FieldInfo fieldInfo = new FieldInfo(propertyName, method, null, clazz, null, ordinal, serialzeFeatures, annotation, null); + fieldInfo.setLabel(label); + fieldInfoMap.put(propertyName, fieldInfo); continue; } @@ -1169,8 +1170,9 @@ public class TypeUtils { } } - fieldInfoMap.put(propertyName, - new FieldInfo(propertyName, method, field, ordinal, serialzeFeatures, label, annotation, fieldAnnotation)); + FieldInfo fieldInfo = new FieldInfo(propertyName, method, field, clazz, null, ordinal, serialzeFeatures, annotation, fieldAnnotation); + fieldInfo.setLabel(label); + fieldInfoMap.put(propertyName, fieldInfo); } if (methodName.startsWith("is")) { @@ -1237,8 +1239,9 @@ public class TypeUtils { } } - fieldInfoMap.put(propertyName, - new FieldInfo(propertyName, method, field, ordinal, serialzeFeatures, label, annotation, fieldAnnotation)); + FieldInfo fieldInfo = new FieldInfo(propertyName, method, field, clazz, null, ordinal, serialzeFeatures, annotation, fieldAnnotation); + fieldInfo.setLabel(label); + fieldInfoMap.put(propertyName, fieldInfo); } } @@ -1277,8 +1280,9 @@ public class TypeUtils { } if (!fieldInfoMap.containsKey(propertyName)) { - fieldInfoMap.put(propertyName, - new FieldInfo(propertyName, null, field, ordinal, serialzeFeatures, label, null, fieldAnnotation)); + FieldInfo fieldInfo = new FieldInfo(propertyName, null, field, clazz, null, ordinal, serialzeFeatures, null, fieldAnnotation); + fieldInfo.setLabel(label); + fieldInfoMap.put(propertyName, fieldInfo); } } @@ -1461,6 +1465,11 @@ public class TypeUtils { if (type instanceof ParameterizedType) { return getClass(((ParameterizedType) type).getRawType()); } + + if (type instanceof TypeVariable) { + Type boundType = ((TypeVariable) type).getBounds()[0]; + return (Class) boundType; + } return Object.class; } diff --git a/src/test/java/com/alibaba/json/bvt/util/FieldInfoTest.java b/src/test/java/com/alibaba/json/bvt/util/FieldInfoTest.java index f090e167c..0d9d820be 100755 --- a/src/test/java/com/alibaba/json/bvt/util/FieldInfoTest.java +++ b/src/test/java/com/alibaba/json/bvt/util/FieldInfoTest.java @@ -5,28 +5,27 @@ import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.List; -import junit.framework.TestCase; - import org.junit.Assert; -import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.util.FieldInfo; import com.alibaba.fastjson.util.ParameterizedTypeImpl; +import junit.framework.TestCase; + public class FieldInfoTest extends TestCase { public void test_null() throws Exception { - FieldInfo fieldInfo = new FieldInfo("getValue", Entity.class.getMethod("getValue"), null); + FieldInfo fieldInfo = new FieldInfo("getValue", Entity.class.getMethod("getValue"), null, null, null, 0, 0, null, null); Assert.assertEquals(null, fieldInfo.getAnnotation()); Field field = GenericFieldEntity.class.getField("value"); Type type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericFieldEntity.class); - FieldInfo fieldInfoOfField = new FieldInfo("value", null, field, GenericFieldEntity.class, type, null); + FieldInfo fieldInfoOfField = new FieldInfo("value", null, field, GenericFieldEntity.class, type, 0, 0, null, null); Assert.assertEquals(fieldInfoOfField.fieldType, ValueObject.class); Assert.assertEquals(fieldInfoOfField.fieldClass, ValueObject.class); field = GenericListFieldEntity.class.getField("value"); type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericListFieldEntity.class); - FieldInfo fieldInfoOfListField = new FieldInfo("value", null, field, GenericListFieldEntity.class, type, null); + FieldInfo fieldInfoOfListField = new FieldInfo("value", null, field, GenericListFieldEntity.class, type, 0, 0, null, null); ParameterizedTypeImpl actualFieldType = (ParameterizedTypeImpl) fieldInfoOfListField.fieldType; Assert.assertEquals(actualFieldType.getActualTypeArguments()[0], ValueObject.class); Assert.assertEquals(actualFieldType.getRawType(), List.class); @@ -35,7 +34,7 @@ public class FieldInfoTest extends TestCase { Method method = GenericSetterEntity.class.getMethod("setValue", Object.class); type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericSetterEntity.class); - FieldInfo fieldInfoOfSetter = new FieldInfo("value", method, null, GenericSetterEntity.class, type, null); + FieldInfo fieldInfoOfSetter = new FieldInfo("value", method, null, GenericSetterEntity.class, type, 0, 0, null, null); Assert.assertEquals(fieldInfoOfSetter.fieldType, ValueObject.class); Assert.assertEquals(fieldInfoOfSetter.fieldClass, ValueObject.class); @@ -43,7 +42,7 @@ public class FieldInfoTest extends TestCase { method = GenericListSetterEntity.class.getMethod("setValue", List.class); type = new ParameterizedTypeImpl(new Type[] { ValueObject.class }, null, GenericListSetterEntity.class); - FieldInfo fieldInfoOfListSetter = new FieldInfo("value", method, null, GenericListSetterEntity.class, type, null); + FieldInfo fieldInfoOfListSetter = new FieldInfo("value", method, null, GenericListSetterEntity.class, type, 0, 0, null, null); Assert.assertEquals(actualFieldType.getActualTypeArguments()[0], ValueObject.class); Assert.assertEquals(actualFieldType.getRawType(), List.class); Assert.assertEquals(fieldInfoOfListSetter.fieldClass, List.class);