diff --git a/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java b/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java index 336d33ea9..5ff3cf62f 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java +++ b/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java @@ -342,8 +342,7 @@ public class ASMSerializerFactory implements Opcodes { for (int i = 0; i < size; ++i) { FieldInfo property = getters.get(i); - Method method = property.getMethod(); - Class propertyClass = method.getReturnType(); + Class propertyClass = property.getFieldClass(); mw.visitLdcInsn(property.getName()); mw.visitVarInsn(ASTORE, context.fieldName()); @@ -741,7 +740,7 @@ public class ASMSerializerFactory implements Opcodes { private void _list(Class clazz, MethodVisitor mw, FieldInfo property, Context context) { Method method = property.getMethod(); - Type propertyType = method.getGenericReturnType(); + Type propertyType = property.getFieldType(); Type elementType; if (propertyType instanceof Class) { diff --git a/src/main/java/com/alibaba/fastjson/serializer/FieldSerializer.java b/src/main/java/com/alibaba/fastjson/serializer/FieldSerializer.java index 25143d2c1..4af593b7a 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/FieldSerializer.java +++ b/src/main/java/com/alibaba/fastjson/serializer/FieldSerializer.java @@ -36,7 +36,7 @@ public abstract class FieldSerializer implements Comparable { public FieldSerializer(FieldInfo fieldInfo){ super(); this.fieldInfo = fieldInfo; - fieldInfo.getMethod().setAccessible(true); + fieldInfo.setAccessible(true); this.double_quoted_fieldPrefix = '"' + fieldInfo.getName() + "\":"; @@ -89,7 +89,7 @@ public abstract class FieldSerializer implements Comparable { } public Object getPropertyValue(Object object) throws Exception { - return getMethod().invoke(object); + return fieldInfo.get(object); } public abstract void writeProperty(JSONSerializer serializer, Object propertyValue) throws Exception; diff --git a/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java b/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java index b6f91ee79..d13e52b70 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java +++ b/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java @@ -184,7 +184,7 @@ public class JavaBeanSerializer implements ObjectSerializer { } public FieldSerializer createFieldSerializer(FieldInfo fieldInfo) { - Class clazz = fieldInfo.getMethod().getReturnType(); + Class clazz = fieldInfo.getFieldClass(); if (clazz == Number.class) { return new NumberFieldSerializer(fieldInfo); diff --git a/src/main/java/com/alibaba/fastjson/util/FieldInfo.java b/src/main/java/com/alibaba/fastjson/util/FieldInfo.java index f4700e647..537b0f21f 100644 --- a/src/main/java/com/alibaba/fastjson/util/FieldInfo.java +++ b/src/main/java/com/alibaba/fastjson/util/FieldInfo.java @@ -93,7 +93,9 @@ public class FieldInfo implements Comparable { public T getAnnotation(Class annotationClass) { T annotation = null; - annotation = method.getAnnotation(annotationClass); + if (method != null) { + annotation = method.getAnnotation(annotationClass); + } if (annotation == null) { if (field != null) { @@ -109,7 +111,16 @@ public class FieldInfo implements Comparable { Object value = method.invoke(javaObject, new Object[0]); return value; } - + return field.get(javaObject); } + + public void setAccessible(boolean flag) throws SecurityException { + if (method != null) { + method.setAccessible(flag); + return; + } + + field.setAccessible(flag); + } } diff --git a/src/test/java/com/alibaba/json/test/bvt/bug/Bug_101_for_rongganlin.java b/src/test/java/com/alibaba/json/test/bvt/bug/Bug_101_for_rongganlin.java index be29440c0..3aca6fe7b 100644 --- a/src/test/java/com/alibaba/json/test/bvt/bug/Bug_101_for_rongganlin.java +++ b/src/test/java/com/alibaba/json/test/bvt/bug/Bug_101_for_rongganlin.java @@ -26,6 +26,7 @@ public class Bug_101_for_rongganlin extends TestCase { structure.groups = groups; System.out.println(JSON.toJSON(structure)); + System.out.println(JSON.toJSONString(structure)); } class Structure { diff --git a/src/test/java/com/alibaba/json/test/bvt/bug/Bug_101_for_rongganlin_case2.java b/src/test/java/com/alibaba/json/test/bvt/bug/Bug_101_for_rongganlin_case2.java new file mode 100644 index 000000000..8144f2aac --- /dev/null +++ b/src/test/java/com/alibaba/json/test/bvt/bug/Bug_101_for_rongganlin_case2.java @@ -0,0 +1,65 @@ +package com.alibaba.json.test.bvt.bug; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; + +import com.alibaba.fastjson.JSON; + +public class Bug_101_for_rongganlin_case2 extends TestCase { + + public void test_for_bug() throws Exception { + Structure structure = new Structure(); + List groups = new ArrayList(); + + List elemA = new ArrayList(); + elemA.add(new Text().set("t.a", "v.t.a")); + elemA.add(new Image().set("i.a", "v.i.a")); + groups.add(new Group().set(elemA)); + + List elemB = new ArrayList(); + elemB.add(new Text().set("t.b", "v.t.b")); + elemB.add(new Image().set("i.b", "v.i.b")); + groups.add(new Group().set(elemB)); + + structure.groups = groups; + + System.out.println(JSON.toJSONString(structure)); + } + + public static class Structure { + + public List groups; + } + + public static class Group implements Object { + + public List elements; + + public Group set(List items) { + this.elements = items; + return this; + } + } + + public static interface Object { + } + + public static abstract class Element { + + public String key, value; + + public Element set(String key, String value) { + this.key = key; + this.value = value; + return this; + } + } + + public static class Text extends Element { + } + + public static class Image extends Element { + } +}