content: package com.alibaba.json.bvt.bug;
  
  import junit.framework.Assert;
  import junit.framework.TestCase;
  
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONArray;
  import com.alibaba.fastjson.JSONObject;
  
  public class Bug_for_zhuel extends TestCase {
  
      public void test_for_zhuel() throws Exception {
          Person[] ps = new Person[3];
          Person p1 = new Person();
          p1.setAge(50);
          p1.setHight("170");
          p1.setId("p1's id");
          p1.setName("person1's name");
          p1.setNames(new String[] { "p1's id", "person1's name" });
          p1.setSex("男");
          Person p2 = new Person();
          p2.setAge(48);
          p2.setHight("155");
          p2.setId("p2's id");
          p2.setName("person2's name");
          p2.setNames(new String[] { "p2's id", "person2's name" });
          p2.setSex("女");
          Person p3 = new Person();
          p3.setAge(10);
          p3.setHight("120");
          p3.setId("p3's id ");
          p3.setName("son's name");
          p3.setNames(new String[] { "p3's id ", "son's name" });
          p3.setSex("男");
          ps[0] = p1;
          ps[1] = p2;
          ps[2] = p3;
  
          Person[] ps1 = new Person[3];
          Person pp1 = new Person();
          pp1.setAge(52);
          pp1.setHight("170");
          pp1.setId("pp1's id");
          pp1.setName("personpp1's name");
          pp1.setNames(new String[] { "pp1's id", "personpp1's name" });
          pp1.setSex("男");
          Person pp2 = new Person();
          pp2.setAge(49);
          pp2.setHight("150");
          pp2.setId("pp2's id");
          pp2.setName("personpp2's name");
          pp2.setNames(new String[] { "pp2's id", "personpp2's name" });
          pp2.setSex("女");
          Person pp3 = new Person();
          pp3.setAge(10);
          pp3.setHight("125");
          pp3.setId("pp3's id");
          pp3.setName("daughter's name");
          pp3.setNames(new String[] { "pp3's id", "daughter's name" });
          pp3.setSex("女");
          ps1[0] = pp1;
          ps1[1] = pp2;
          ps1[2] = pp3;
  
          Person[] ps2 = new Person[3];
          Person a1 = new Person();
          a1.setAge(52);
          a1.setHight("170");
          a1.setId("a1's id");
          a1.setName("a1's name");
          a1.setNames(new String[] { "a1's id", "a1's name" });
          a1.setSex("男");
          Person a2 = new Person();
          a2.setAge(49);
          a2.setHight("150");
          a2.setId("a2's id");
          a2.setName("a2's name");
          a2.setNames(new String[] { "a2's id", "a2's name" });
          a2.setSex("女");
          Person a3 = new Person();
          a3.setAge(10);
          a3.setHight("125");
          a3.setId("a3's id");
          a3.setName("daughter's name");
          a3.setNames(new String[] { "a3's id", "daughter's name" });
          a3.setSex("女");
          ps2[0] = a1;
          ps2[1] = a2;
          ps2[2] = a3;
  
          Family f1 = new Family();
          f1.setId("f1's id");
          f1.setAddress("f1's address");
          f1.setChildrennames(new String[] { "p1's name", "p2's name", "p3's name" });
          f1.setIncome(100000000);
          f1.setMaster(p1);
          f1.setName("person1's home");
          f1.setPs(ps);
          f1.setTest(1994.08);
  
          Family f2 = new Family();
          f2.setId("f2's id");
          f2.setAddress("f2's address");
          f2.setChildrennames(new String[] { "pp1's name", "pp2's name", "pp3's name" });
          f2.setIncome(100000000);
          f2.setMaster(pp1);
          f2.setName("personpp1's home");
          f2.setPs(ps1);
          Family f3 = new Family();
          f3.setId("f3's id");
          f3.setAddress("f3's address");
          f3.setChildrennames(new String[] { "a1's name", "a2's name", "a3's name" });
          f3.setIncome(100000000);
          f3.setMaster(a1);
          f3.setName("a1's home");
          f3.setPs(ps2);
          f3.setTest(1995.08);
          Family[] fs = new Family[3];
          fs[0] = f1;
          fs[1] = f2;
          fs[2] = f3;
          System.out.println(JSON.VERSION);
          String sfs = JSON.toJSONString(fs, true);
  
          Assert.assertSame(fs[0].getMaster(), fs[0].getPs()[0]);
          System.out.println(sfs);
  
          {
              Family[] result = JSON.parseObject(sfs, Family[].class);
              Assert.assertSame(result[0].getMaster(), result[0].getPs()[0]);
              Assert.assertSame(result[1].getMaster(), result[1].getPs()[0]);
              Assert.assertSame(result[2].getMaster(), result[2].getPs()[0]);
          }
          {
              JSONArray array = JSON.parseArray(sfs);
              for (int i = 0; i < array.size(); ++i) {
                  JSONObject jsonObj = array.getJSONObject(i);
                  Assert.assertSame(jsonObj.get("master"), jsonObj.getJSONArray("ps").get(0));
              }
          }
      }
  
      public static class Family {
  
          private String   id;
          private String   name;
          private Person[] ps;
          private String   address;
          private String[] childrennames;
          private Person   master;
          private long     income;
          private double   test;
  
          public String getId() {
              return id;
          }
  
          public void setId(String id) {
              this.id = id;
          }
  
          public String getName() {
              return name;
          }
  
          public void setName(String name) {
              this.name = name;
          }
  
          public Person[] getPs() {
              return ps;
          }
  
          public void setPs(Person[] ps) {
              this.ps = ps;
          }
  
          public String getAddress() {
              return address;
          }
  
          public void setAddress(String address) {
              this.address = address;
          }
  
          public String[] getChildrennames() {
              return childrennames;
          }
  
          public void setChildrennames(String[] childrennames) {
              this.childrennames = childrennames;
          }
  
          public Person getMaster() {
              return master;
          }
  
          public void setMaster(Person master) {
              this.master = master;
          }
  
          public long getIncome() {
              return income;
          }
  
          public void setIncome(long income) {
              this.income = income;
          }
  
          public double getTest() {
              return test;
          }
  
          public void setTest(double test) {
              this.test = test;
          }
      }
  
      public static class Person {
  
          private String   id;
          private String   name;
          private String   sex;
          private int      age;
          private String[] names;
          private String   hight;
  
          public String getId() {
              return id;
          }
  
          public void setId(String id) {
              this.id = id;
          }
  
          public String getName() {
              return name;
          }
  
          public void setName(String name) {
              this.name = name;
          }
  
          public String getSex() {
              return sex;
          }
  
          public void setSex(String sex) {
              this.sex = sex;
          }
  
          public int getAge() {
              return age;
          }
  
          public void setAge(int age) {
              this.age = age;
          }
  
          public String[] getNames() {
              return names;
          }
  
          public void setNames(String[] names) {
              this.names = names;
          }
  
          public String getHight() {
              return hight;
          }
  
          public void setHight(String hight) {
              this.hight = hight;
          }
  
      }
  
  }
  