Struts2中采用Json返回List对象数据为空解决方案

来源:互联网 发布:游戏平板推荐 知乎 编辑:程序博客网 时间:2024/06/01 07:17

原文地址:http://www.cnblogs.com/warden/archive/2012/01/07/2315427.html

前言:

  今天在写一个Android的项目的时候需要服务器通过返回Json对象传递数据,Json中的数据是一个List对象,List中是一堆自定义Message对象。但是在返回的时候接收到的却是空数据。

?
{"list":[]}

服务器采用的是Struts2+Hibernate+Mysql。这部分功能实现只与Struts2有关。

正文:

  很久没有使用Struts2,出现问题的时候以为是记错了,需要在Action中自己对Json进行封装,或者是Message类需要实现序列化等,调试皆不能解决问题。

复制代码
 1 public class GetNewsAction { 2      3     public int id;//请求中传递来的参数 4     public List<Message> list;//需要通过Json返回的数据 5      6     public String execute(){ 7         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 8         list = new ArrayList<Message>(); 9         list.add(new Message(1,"Test","123",format.format(new Date()),false,"hah",1));10         list.add(new Message(1,"Test","123",format.format(new Date()),false,"hah",1));11         list.add(new Message(1,"Test","123",format.format(new Date()),false,"hah",1));12         return "success";13     }14 //省略getter、setter方法15 }
复制代码

  返回的List中肯定是有数据的,Message类中所有的属性也都提供了相应的getter/setter方法。但是却不能接受到结果。

1 <action name="test" class="com.bgq.action.GetNewsAction">2     <result type="json">3         <param name="includeProperties">list</param>4     </result>5 </action>

  一开始在struts2的配置文件中是这么写的,指定返回Json对象包括list。结果返回为空数据,查各种资料各种百度,最后发现应该写成类似于:

复制代码
1 <action name="test" class="com.bgq.action.GetNewsAction">2     <result type="json">3         <param name="includeProperties">4                  list\[\d+\]\.id,list\[\d+\]\.name,xxx <!--正则表达式--!>5                 </param>6     </result>7 </action>
复制代码

  在指定返回数据为list的同时指定返回list中的哪些数据。不然取不到返回结果。

  因为整个只有2个属性,向上面这样设置太过繁琐,最后如下设置达到相同的效果:

1 <action name="test" class="com.bgq.action.GetNewsAction">2     <result type="json">3         <param name="excludeProperties">id</param>4     </result>5 </action>

  最后输出数据如下:

?
{"list":[{"id":1,"message":"123","name":"hah","read":false,"time":"2012-01-06 23:41:29","title":"Test","uid":1},
{"id":1,"message":"123","name":"hah","read":false,"time":"2012-01-06 23:41:29","title":"Test","uid":1},
{"id":1,"message":"123","name":"hah","read":false,"time":"2012-01-06 23:41:29","title":"Test","uid":1}]}

  然后再Android中通过HttpClient和HttpGet得到HttpResponse对象,通过response.getEntity().getContent()方法取得到了Json数据,最后手动封装还原成List对象,完成数据传递功能。

 

注意在Struts2中使用Json需要有相应的Jar包(struts2-json-plugin-x.x.x.jar)支持,以及在配置Action的时候Package从json-default继承。