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


    前言:

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

    {"list":[]}

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

    正文:

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

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

      返回的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继承。

    补充:

     1 <result type="json">
     2                 <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
     3                 <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->
     4                 <param name="root">list</param>
     5                 <!-- 指定是否序列化空的属性 -->
     6                 <param name="excludeNullProperties">true</param>
     7                 <!-- 这里指定将序列化list中的那些属性 -->
     8                 <param name="includeProperties">list.* </param>
     9                 <!-- 这里指定将要从list中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->
    10                 <param name="excludeProperties">id</param>
    11 </result>
  • 相关阅读:
    I/O多路复用和Socket
    我读过的最好的epoll讲解--转自”知乎“
    gcc和g++的区别
    详解派生类构造函数与析构函数
    C++中构造函数,拷贝构造函数和赋值函数的区别和实现
    浅拷贝和深拷贝的区别?
    曲演杂坛--特殊字符/生僻字与varchar
    SQL SERVER--单回话下的死锁
    曲演杂坛--表变量的预估行数
    曲演杂坛--为什么SELECT语句会被其他SELECT阻塞?
  • 原文地址:https://www.cnblogs.com/warden/p/2315427.html
Copyright © 2020-2023  润新知