diff --git a/src/main/java/com/alibaba/fastjson/JSONWriter.java b/src/main/java/com/alibaba/fastjson/JSONWriter.java
index 3cb381428..47b2060e0 100644
--- a/src/main/java/com/alibaba/fastjson/JSONWriter.java
+++ b/src/main/java/com/alibaba/fastjson/JSONWriter.java
@@ -16,14 +16,18 @@ public class JSONWriter {
private Context context;
public static enum State {
- None, BeginObject, PropertyKey, PropertyValue, BeginArray, ArrayValue
+ BeginObject, //
+ PropertyKey, //
+ PropertyValue, //
+ BeginArray, //
+ ArrayValue
}
public static class Context {
private final Context parent;
- private State state = State.None;
+ private State state;
public Context(Context parent, State state){
this.parent = parent;
diff --git a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java
index 425423598..3960e0e09 100644
--- a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java
+++ b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java
@@ -279,7 +279,7 @@ public class DefaultJSONParser extends AbstractJSONParser {
this.setResolveStatus(TypeNameRedirect);
- if (this.context != null) {
+ if (this.context != null && fieldName instanceof String) {
this.popContext();
}
diff --git a/src/test/java/com/alibaba/json/bvt/bug/Bug_for_cduym.java b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_cduym.java
new file mode 100644
index 000000000..650124f69
--- /dev/null
+++ b/src/test/java/com/alibaba/json/bvt/bug/Bug_for_cduym.java
@@ -0,0 +1,101 @@
+package com.alibaba.json.bvt.bug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+
+public class Bug_for_cduym extends TestCase {
+
+ @SuppressWarnings("rawtypes")
+ public void test0() {
+
+ List as = new ArrayList();
+
+ A a1 = new A();
+ a1.setA(1000);
+ a1.setB(2000l);
+ a1.setC("xxx");
+
+ as.add(a1);
+ as.add(a1);
+
+ String text = JSON.toJSONString(as, SerializerFeature.WriteClassName);
+ List> target = (List) JSON.parseObject(text, Object.class);
+
+ Assert.assertSame(target.get(0), target.get(1));
+ }
+
+ public void test1() {
+
+ List as = new ArrayList();
+
+ A a1 = new A();
+ a1.setA(1000);
+ a1.setB(2000l);
+ a1.setC("xxx");
+
+ as.add(a1);
+ as.add(a1);
+
+ Demo o = new Demo();
+ o.setAs(as);
+
+ String text = JSON.toJSONString(o, SerializerFeature.WriteClassName);
+ Demo target = (Demo) JSON.parseObject(text, Object.class);
+
+ Assert.assertSame(((List)target.getAs()).get(0), ((List)target.getAs()).get(1));
+ }
+
+
+ public static class Demo {
+
+ private Object as;
+
+ public Object getAs() {
+ return as;
+ }
+
+ public void setAs(Object as) {
+ this.as = as;
+ }
+
+ }
+
+ private static class A {
+
+ private Integer a;
+ private Long b;
+
+ private String c;
+
+ public Integer getA() {
+ return a;
+ }
+
+ public void setA(Integer a) {
+ this.a = a;
+ }
+
+ public Long getB() {
+ return b;
+ }
+
+ public void setB(Long b) {
+ this.b = b;
+ }
+
+ public String getC() {
+ return c;
+ }
+
+ public void setC(String c) {
+ this.c = c;
+ }
+
+ }
+}