1. 程式人生 > >List集合轉JSONArray方法以及常見問題的解決辦法

List集合轉JSONArray方法以及常見問題的解決辦法

SSH 專案中非同步提交需要用到JSON返回給頁面一個json字串
在XXXAction就要把從DAO裡查詢返回的List集合轉成JSONArray陣列
通常是:
java程式碼:

List list = bookService.findAll();//全查詢返回book的List集合結果
JSONArray jsonArray =JSONArray.fromObject(list);//把list轉成JSONArray
String json = jsonArray.toString();//json字串
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");//改編碼
PrintWriter out =ServletActionContext.getResponse().getWriter();//獲取PrintWriter物件
out.print(json);//把json字串返回的頁面

而如果在專案中出現多表 有主外來鍵關係,即hibernate對映會有一對多或者多對一的關係。
實體類中 “多”的一方會有“一”的一方的實體物件,而“一”的一方會有“多”的一方的Set集合。
在查詢返回List物件轉成JSONArray的時候,以上程式碼就會報錯。
解決辦法 —— 把查詢出來中的實體物件 或者 Set集合過濾掉:

java程式碼:

List list = bookService.findAll();//全查詢返回book的List集合結果
JsonConfig config = new JsonConfig();
config.setExcludes(new String[] { "Category"});
//紅色的部分是過濾掉Category物件 不轉成JSONArray
JSONArray jsonArray = JSONArray.fromObject(list,config);
String json = jsonArray.toString();//json字串
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");//改編碼
PrintWriter out =ServletActionContext.getResponse().getWriter();//獲取PrintWriter物件
out.print(json);//把json字串返回的頁面

用一上過濾掉實體物件就不會報錯了,可是如果頁面需要像是種類表的名字,而你恰恰把Category這個物件過濾,獲取不到種類名字,這樣就苦惱了。於是老師在看過幫助文件之後告訴我們另一種方法。

java程式碼:

List list = bookService.findAll();//全查詢返回book的List集合結果
JsonConfig config = new JsonConfig();
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

JSONArray jsonArray = JSONArray.fromObject(list,config);
String json = jsonArray.toString();//json字串
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");//改編碼
PrintWriter out =ServletActionContext.getResponse().getWriter();//獲取PrintWriter物件
out.print(json);//把json字串返回的頁面

不管是查詢“多”的一方還是“一”的一方都可以用以上程式碼解決了。
不過“多”的一方的對映檔案中的many-to-one元素要加個lazy="false"(不延遲載入)的屬性哦。不然還是會報錯。