fastjson通过SerializerFeature.WriteClassName实现自省功能优化

JSON标准是不支持自省的,也就是说如下的JSON文本,你不知道它是什么类型: 

Java代码 

 收藏代码

  1. {"id":12,"name":"魏嘉留"}  



fastjson支持传入类型信息,例如: 
 

Java代码 

 收藏代码

  1. String text = ...; // {"id":12,"name":"魏嘉留"}  
  2. JSON.parseObject(text, Employee.class);  



如果序列化时,使用WriteClassName的特性,JSON文本是这样: 

Java代码 

 收藏代码

  1. Employee x = ...;  
  2. String text = JSON.toJSONString(x, SerializerFeature.WriteClassName);  


上面例子中的JSON文本是: 

Java代码 

 收藏代码

  1. {“@type”:"com.alibaba.demo.Employee", "id":12,"name":"魏嘉留"}  



带有@type属性的文本将会被自动识别类型,上面的文本可以这样处理: 

Java代码 

 收藏代码

  1. Employee x = (Employee) JSON.parse(text);  

这就是Fastjson支持的自省功能。

注:

若之前进行序列化的x是Employee的子类且使用了SerializerFeature.WriteClassName,那么经过反序列化Employee x = (Employee) JSON.parse(text)以后,神奇的事情就出现了:

这时候再进行System.out.println(JSON.toJSONString(x))则会输出子!类!的!完整json信息!!


但是使用WriteClassName之后,json文本的大小增加了许多,这个怎么办呢?fastjson 1.1.6版本将会做优化处理,非必要,不输出类型信息。 

Java代码 

 收藏代码

  1. class A {  
  2. B getB();  
  3. setB(B b);  
  4. }  



类A拥有属性B,A和B都是对象,但是反序列化的时候,能够根据Property的类型信息得到B的类型,这时只需要输出A的类型,不需要输出B的类型信息。 

例如: 

Java代码 

 收藏代码

  1. {"@type":"com.alibaba.json.demo.A","b":{"id":0}}  



在1.1.5之前的版本则会如下: 

Java代码 

 收藏代码

  1. {"@type":"com.alibaba.json.demo.A","b":{"@type":"com.alibaba.json.demo.B","id":0}}  



通过这种办法可以用List<T>类型的属性,由此能够减少冗余不必要的类型信息。 

如下是一些测试用例: 
http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/com/alibaba/json/test/bvt/writeClassName/WriteClassNameTest2.java
 

Java代码 

 收藏代码

  1. http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/com/alibaba/json/test/bvt/writeClassName/WriteClassNameTest_List2.java   

猜你喜欢

转载自blog.csdn.net/u012501054/article/details/88896735