场景分析
如果项目大量使用了ajax或者项目使用了类似extjs这种富客户端框架的朋友们可能会经常碰到一个问题:我们如何为客户端提供正确有效的数据?例如以下简单需求:
有一个界面,用于显示用户名、用户所在公司名称、用户拥有的权限名称,使用ajax去服务端获取数据。
我们有以下三个类:
User:用户类
Company:公司类
Role:角色类
用户类1:M角色,用户类1:1公司。
这里有一段测试代码,调用了j-hi的JSONObject API进行序列化:
我们测试结果如下:
{"user":{"mobile":null,"primarykey":null,"parentEntity":null,"class":class test.User,"dataSymbol":null,"username":"zhangsan","cascadeDirty":false,"roles":[{"rolename":"角色1","primarykey":null,"parentEntity":null,"class":class test.Role,"dataSymbol":null,"cascadeDirty":false,"dirty":false,"deletedFlag":false,"version":1},{"rolename":"角色2","primarykey":null,"parentEntity":null,"class":class test.Role,"dataSymbol":null,"cascadeDirty":false,"dirty":false,"deletedFlag":false,"version":1}],"dirty":false,"deletedFlag":false,"version":null,"company":null},"id":1}
我们发现,将整个对象序列化了。尤其是company对象,客户端只需要公司名,但结果是所有属性都被序列化了。
我们不需要序列化所有属性,在新版本的J-Hi中,提供了新的方法,输出我们需要的属性,看如下例子:
输出结果如下:
{"user":{"username":"zhangsan","roles":[{"rolename":"角色1"},{"rolename":"角色2"}],"company":{"companyName":"新浪"}},"id":1}
完美达到我们的要求。
在某些需求中,我们甚至可以从客户端发起获取数据的请求,动态的获取我们需要的数据,比如我们发起一个请求:
{
'entity': 'xxxxx.user.User' ,
'returnType':'JSON',
'properties': 'username, company.companyName, roles.rolename'
},
请求获取User类对象的以下属性username,company.companyName,roles.rolename
服务器端返回User类型对象,并序列化成JSON返回,返回以下几个属性username,company.companName.
通过j-hi的新JSONObject API,我们可以很方便实现这样的功能,为客户端提供任意数据。甚至能实现万能的服务器查询API。
代码分析:
JSONObject类一个将多个java对象封装成一个JSON字符串的工具类,每一个java(POJO)对象都是对象JSON字符串的一个属性,可以通过addJSONObject(),为要转换的JSON不断加入新的java对象。
缺省在创建JSONObject对象时,构建函数参数已经加了一个java对象,如果JSON可能会有多个java对象拼接而成,就可以通过addJSONObject()累加的方式实现。
/**
*添加一个待转换的java对象,使其作为JSON字符串的一部分
*@paramjsonPropertyName给定JSON的属性名
*@paramobj待转换的java对象,这个java对象可以是基础类型比如日期、字符串,也可以是POJO对象,或者是Collection集合类对象
*@paramobjectProperties返回JSON字符串对应POJO的属性名列表,属性名与属性名之间用逗号分隔,如果该java对象的某个元素是集合也可以支持即集合属性名.集合元素对象属性名
*,例如HiUser的POJO"id,org.orgName,org.id",注意:如果该参数为空
*则只转换一级属性,即它不会级联的返回属性的属性值
*/
publicvoid addJSONObject(String jsonPropertyName, Object obj, String objectProperties)
/**
*获得封装后的JSON对象
*@return返回一个JSON对象的字符串
*/
public String toString()
目的与意义:
1、 在一次客户端的请求过程中,尽量的压缩传输数据的传输量,从而降低带宽,提高传输效率
2、 提高浏览器的对JSON对象的解析速度,对于IE浏览器来说9以下的版本对JSON的解析速度都很差,这也是适应目前客户现场情况解决实际问题的方法
3、 一个清爽没有数据冗余的JSON对象,更方便你在客户端做数据控制,例如根据返回的JSON动态的显示列表的列数
注:该文档由J-Hi爱好者"叶青"提供,他的QQ号为405986916,欢迎大家与他在技术上多多交流