先上代码
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则可以正确输出。无论内部类静态与否,以上输出记过不变