Json升级带来的影响

Json 官方提供的代码没有设置版本。因此,这里根据代码变化的最新日期作为版本以示区别。

1、Json.v2008.04.25 以前版本

在Json.v2008.04.25 版本(包含V2008.04.25)以前,JSONObject对象在转换Object对象实例的时候,使用的是getMethods()这个方法。

getMethods()获取在当前被转换为Json的类以及在这个类所有父类中声明的方法。
其中,在java.lang.Object有一个getClass()方法,获得当前类的全名称。

这个方法在转换过程中被执行,因此在转换后的Json数据中,除了必要的属性外,还包括一个 class 为主键的值对。
比如,对于一个包名为 org.teamlet.ws.business 类名为Department 的类,经过Json转换后,在Json数据中会有一个值对。
主键(key)为 class ; 值(value)为当前的类全名:org.teamlet.ws.business.Department 

这种情况有利也有弊:
好处是在服务端不需要做任何设置,从Json数据中获得相应的class就可以直接完成从json到java的转换。

问题是,
第一:暴露了服务端的信息;
第二:使得Java客户端必须使用和服务端完全一样的包名,原本纯粹的数据之间的转换增加了约束条件;
第三:对于其他语言(目前实现的有PHP、C/C++、C#、JavaScript)要额外设置这个class的值。

2、Json.v2008.06.25以后版本

在Json.v2008.06.25 版本(包含V2008.06.25)以后的版本,JSONObject对象在转换Object对象实例的时候,增加了一个参数:boolean includeSuperClass 。

如果参数设置为true,则效果和Json v2008.04.25一样,使用的是getMethods()这个方法。
如果参数设置为false,则会使用getDeclaredMethods()这个方法,这个方法只获取当前类声明的方法,因此父类java.lang.Object中一个getClass()方法不能获得,在转换后的Json数据中就没有了上面提到的以class为主键的值对。

这样,为客户端带来了很大的灵活性。客户端可以任意构造包含业务属性的类,而不必关心是类的包名是什么。而这些包名对于PHP、JavaScript是没有用的。

但同时也带来了问题,如何在服务端转换为对应的业务需要实例?

3、与Json-lib的差别

Json-lib是一个基于Json格式开发的完全不同于Json官方的开源工具。
在Json-lib中使用的就是后一种Json的转换,就是使用getDeclaredMethods()方法,在Json数据中不包括class值对。(除此之外还有其他的不同,偏离了主题不再详述)

使用Json-lib进行数据传输需要在服务端做根据业务做一些配置工作。

4、对应用的影响

restlet用的是Json早期的版本,webservice组件也因此受到影响。
好在webservice组件同时支持Json和Json-lib,同时兼容并不困难。
只是客户端的变化带来较大的影响,特别是对已经部署即将使用的系统。
Json升级后传输和转换方面的性能不会变化太大;
服务端变为统一的转换形式,丧失的是即插即用、零配置的特性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值