fastjson实现自省功能优化

转载自温少的ITeye博客:http://wenshao.iteye.com/blog/1177410

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

Java代码 收藏代码
  1. {"id":12,"name":"魏嘉留"}


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

Java代码 收藏代码
  1. Stringtext=...;//{"id":12,"name":"魏嘉留"}
  2. JSON.parseObject(text,Employee.class);


如果序列化时,使用WriteClassName的特性,JSON文本是这样:
Java代码 收藏代码
  1. Employeex=...;
  2. Stringtext=JSON.toJSONString(x,SerializerFeature.WriteClassName);

上面例子中的JSON文本是:
Java代码 收藏代码
  1. {“@type”:"com.alibaba.demo.Employee","id":12,"name":"魏嘉留"}


带有@type属性的文本将会被自动识别类型,上面的文本可以这样处理:
Java代码 收藏代码
  1. Employeex=(Employee)JSON.parse(text);


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

但是使用WriteClassName之后,json文本的大小增加了许多,这个怎么办呢?fastjson 1.1.6版本将会做优化处理,非必要,不输出类型信息。
Java代码 收藏代码
  1. classA{
  2. BgetB();
  3. setB(Bb);
  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值