List集合轉JSONArray方法以及常見問題的解決辦法 阿新 • • 發佈:2018-12-25 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"(不延遲載入)的屬性哦。不然還是會報錯。