List集合转JSONArray方法以及常见问题的解决办法

时间:2021-07-06 21:15:10
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"(不延迟加载)的属性哦。不然还是会报错。