前言:
今天在寫一個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>
