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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM