关于内部类的问题

103 阅读1分钟

先上代码


public class ChildEvent {

   private String childId;

   private Child child;

   public Child getChild() {
      return child;
   }

   public void setChild(Child child) {
      this.child = child;
   }

   public String getChildId() {
      return childId;
   }

   public void setChildId(String childId) {
      this.childId = childId;
   }

   public static class Child implements Serializable {
      private String cChildId;

      public String getcChildId() {
         return cChildId;
      }

      public void setcChildId(String cChildId) {
         this.cChildId = cChildId;
      }
   }

}
@org.junit.Test
public void testObj2Str1(){
    //高级set的方式
   ChildEvent childEvent = new ChildEvent() {{
      setChildId("1");
      setChild(new Child() {{
         setcChildId("2");
      }});
   }};
   System.out.println(com.alibaba.fastjson.JSON.toJSONString(childEvent));//输出{"child":{},"childId":"1"},不会实例化内部类(无论是不是静态的),所以内部类set的值无法转json
   System.out.println(new Gson().toJson(childEvent));//输出null

   /**
    * 输出
    * {"child":{},"childId":"1"}
    * null
    */
}

@org.junit.Test
public void testObj2Str2(){
    //基础set的方式
   ChildEvent childEvent2 = new ChildEvent();
   childEvent2.setChildId("21");
   ChildEvent.Child child = new ChildEvent.Child();
   child.setcChildId("22");
   childEvent2.setChild(child);
   System.out.println(com.alibaba.fastjson.JSON.toJSONString(childEvent2));
   System.out.println(new Gson().toJson(childEvent2));

   /**
    * 输出
    * {"child":{},"childId":"21"}
    * {"childId":"21","child":{"cChildId":"22"}}
    */
}

问题出在内部类,上面两种set值的方式还是有差异的

先说说第一种testObj2Str1

        用fastjson转换的时候,fastjson无法转内部类(经实践,不管是否是静态内部类,都无法转),只能转ChildEvent这个对象

        用Gson转的时候,啥也不能转,它对这种方式就是不支持。。。

再说说第二种testObj2Str2:

        用fastjson转换的时候还是和第一种一样,所以它只是对内部类敏感而已。。

        用Gson转的时候,完全可以转,所以它是对高级set的方式敏感。。。


@org.junit.Test
public void testStr2Obj(){
   String childStr = "{\"childId\":\"21\",\"child\":{\"cChildId\":\"22\"}}";
   ChildEvent childEvent = JSON.parseObject(childStr, ChildEvent.class);
   System.out.println(childEvent.getChildId());//21
   System.out.println(childEvent.getChild().getcChildId());//null
}

@org.junit.Test
public void testStr2Obj2(){
   String childStr = "{\"childId\":\"21\",\"child\":{\"cChildId\":\"22\"}}";
   ChildEvent childEvent = new Gson().fromJson(childStr, ChildEvent.class);
   System.out.println(childEvent.getChildId());//21
   System.out.println(childEvent.getChild().getcChildId());//22
}

同样的,反过来,字符串转对象的话,如果用fastjson转,内部类的值无法转

如果用Gson则可以正确输出。无论内部类静态与否,以上输出记过不变