java中list列表转为json数据的方法

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"(不延迟加载)的属性哦。不然还是会报错。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值