日期:2014-05-16 浏览次数:20479 次
???? 项目中用到JSON之后,稍不注意就会出现问题,当然,遇到问题最多的情况就是项目集成Hibernate之后,由于Hibernate的懒加载带来的序列化问题。由于JSON的原理是将对象进行序列化,而序列化就是将对象字符串化,由于Hibernate的懒加载,会带来级联,就会导致序列化时将对象级联的对象全部序列化,然后再对级联的级联对象进行序列化,这样很可能就会报错,即使不报错,也会带来问题,本来只想返回前台一个对象的数据,结果返回了N个对象的数据,无疑导致了传输数据的压力。而解决这种问题主要有以下几种方法:
????? 1.如果项目运用了struts2以及Strus2的jsonplugin,为了避免对不需要的对象进行传输,可以在get方法上加上@Json(serialize=false).这样在传递Json的时候就不会对此对象序列化。同理,如果遇到Hibernate的Entity,则对不需要传输的对象或数据的get方法上加上@Json(serialize=false),就不会对这些进行Json序列化。
????? 2.第二种方法,就是在Struts2的返回值时候进行添加param标签,具体如下:
?
?????
<result type="json"><param name="includeProperties">infoMsg</param></result>
??? 上述方式为只传递变量为infoMsg的Json字符串。
????
<param name="includeProperties">userList\[\d+\]\.id</param>
????上述为值传递userList集合中包含的对象里的id属性
???
<result type="json">
<param name="includeProperties">imgList\[\d+\]</param>
</result>
??? 上述为传递imageList
???
<result type="json"><param name="excludeProperties">infoMsg</param></result>
??? 上述为排除infoMsg
??
<result type="json">
<param name="root">userList\[\d+\]</param>
</result>
?? 上述为值传递userList的根属性。比如userList有个id属性,则传递时的格式为{id:1},同样如果包传递的是个map,则不传递Map名称,只传递键值对。