javaEE SSH框架对象转json问题

最近毕设需要给App端写接口,一般都是返回json格式的数据,但是将对象转为json时总是报错,之前做后台界面使用ajax的时候也出现过。

一、需求:返回学生信息、学生对应部门信息、学生对应班级信息json数据

(1)实体类

public class Student implements java.io.Serializable{
	/**
	 *
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String stuNum;
	private String stuName;
	private String sex;
	private Timestamp birthday;
	private String grade;
	private String photo;

	private Department department;
	private Class_ class_;
	private Role role;

(2)找到学生对象,调用一个自己写的方法将对象转为json数据并输出

Student stuFind=userFind.getStudent();
JsonUtil.toJson(ServletActionContext.getResponse(), stuFind);

(3)转为json并输出的方法

public class JsonUtil {
	//使用Gson--->xx转化成json
    public static void toJson(HttpServletResponse response, Object data)
        throws IOException {
        Gson gson = new Gson();
        String result = gson.toJson(data);
        response.setContentType("text/json; charset=utf-8");
        response.setHeader("Cache-Control", "no-cache"); //取消浏览器缓存
        PrintWriter out = response.getWriter();
        System.out.println(result);
        out.print(result);
        out.flush();
        out.close();
    }

(4)错误信息,栈溢出,因为学生还关联了部门、班级等信息,它会根据关联信息继续查找,导致栈溢出或者死循环的问题

二、解决方法

(1)将学生对应的role、 department和role排除

				JsonConfig jc_student=new JsonConfig();
				jc_student.setJsonPropertyFilter(new PropertyFilter() {

					@Override
					public boolean apply(Object class_, String property, Object proValue) {
						if(property.equals("role")||property.equals("department")||property.equals("class_")){
							return true;
						}
						else{
							return false;
						}
					}
				});
				JSONArray json_student =JSONArray.fromObject(stuFind,jc_student);
				JsonUtil.toJson(ServletActionContext.getResponse(), json_student);

(2)测试结果成功

三、还需要返回学生对应的部门和班级,但是没次都是通过上面的方法将关联的外键属性去除掉有些麻烦

(1)考虑写一个公共的方法,将对应对象的管理外键属性去掉

    //过滤掉关联的外键
    public static JSONObject jsonFilter(Object obj, String[] filterNames){
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setIgnoreDefaultExcludes(false);
        jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);    //防止自包含

        if(filterNames != null){
            //这里是核心,过滤掉不想使用的属性
            jsonConfig .setExcludes(filterNames) ;
        }
        JSONObject jsonObj = JSONObject.fromObject(obj, jsonConfig);
        return jsonObj;

    }

(2)实现

				Student stuFind=userFind.getStudent();
				String[] stuProperty={"role","department","class_"};
				map.put("student", JsonUtil.jsonFilter(stuFind, stuProperty));
				//部门
				Department deptFind=stuFind.getDepartment();

				String[] deptProperty={"children","parent","students","teachers","classes","courses"};
				map.put("department", JsonUtil.jsonFilter(deptFind, deptProperty));
				//班级
				Class_ classFind=stuFind.getClass_();
				String[] classProperty={"department","students"};
				map.put("class_", JsonUtil.jsonFilter(classFind, classProperty));

				JsonUtil.toJson(ServletActionContext.getResponse(), map);

(3)测试成功,学生、部门、班级

四、总结

遇到问题总是好的,可以学到更多的东西。总之,还有很多要去学习的,加油。

时间: 2024-10-07 05:43:42

javaEE SSH框架对象转json问题的相关文章

关于SSH 持久对象转Json双向关联解析过度的解决办法

小弟是一名被部分程序员所鄙视的培训狗,昨天做项目遇到一个问题,在SSH框架通过ajax向界面传递数据的时候,由于对象之间双向关联导致json解析过度,造成内存溢出,网上搜索了解决办法除了过滤某些关联对象之外就没有别的办法了,我的想法是通过设置解析深度来解决过度抓取的问题,开始也考虑性能问题,最好的解决办法就是做一个视图,单独写一个model .但是又不希望这样繁琐,后来发现换个观点一想,能解决这个过度解析的问题对系统的性能的提升其实也很大了,所以就自己动手准备写一个转换工具类,办法也很明了递归.

[JavaEE] SSH框架笔记_eclipse搭建SSH框架详解

SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring,Hibernate. 1.eclipse:eclipse下载的时候建议下载JavaEE版的eclipse. 当然你也可以下载eclipse-SDK.(下载eclipse-SDK需要下载Web,Tomcat等plugins) 2.Struts2:http://struts.apache.org/downloa

javaEE SSH框架 qq第三方登录及用户绑定

前几天刚申请好域名,下面实现网站的qq第三方登录的功能,javaEE的SSH框架.(一些细节问题没有处理,只是大体上实现) 一:首先说一下需求,第一次使用qq第三方登录的用户需要绑定已有的网站用户名,绑定成功后进入首页.以后再使用qq第三方登录就直接进入网站首页. 二:要想使用qq第三方首先需要申请应用(需要有自己的域名) (1)登录qq互联网站申请应用,http://connect.qq.com/ (2)创建应用 (3)创建好之后还是可以修改的,这里回调地址我用的是域名+back.jsp界面(

javaEE SSH框架 qq第三方登录及用户绑定(java sdk版)

之前有位朋友用js sdk实现了 SSH框架下的qq第三方登录功能,但是我发现使用js sdk 有些无法克服的安全问题,所以我改用java sdk来实现这个功能! 如图,使用java sdk时,回调地址应设置为一个.action链接.(注意!修改回调地址的话,官方不会及时给你审核通过,有的人修改回调地址后一年 官方都没给他审核通过,这意味着[修改回调地址不如 要重新申请一个域名!重新申请一次网站接入]) 使用官方给定的Sdk4J.jar时 控制台会打印许多log信息,这严重影响项目的运行效率,所

javaEE SSH框架使用ChartDirector绘图

最近做毕设想要在web端显示图表,网上有很多图表的插件,JFreeChart也不错,不过我选择的是ChartDirector. 一.需求:分页显示学生访问对应课程次数的柱状图,(之前我爬取了网站上的一些课程,并记录了用户访问的记录) 二.实现: (1)ChartDirector自带一个jsp文件,复制到项目中,还有将ChartDirector.jar包引入项目中 (2)要显示图表的jsp界面,其中chart1URL和imageMap1是Action层处理好传递过来的数据,分页的代码可以忽略掉,其

JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j [转]

1. 加入log4j和slf4j的jar包 2. web.xml: [html] view plaincopyprint? <context-param> <!--log4j配置地址 --> <param-name>log4jConfigLocation</param-name> <!-- <param-value>/WEB-INF/classes/log4j.properties</param-value> --> &l

JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j

1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>log4jConfigLocation</param-name> <!-- <param-value>/WEB-INF/classes/log4j.properties</param-value> --> <param-value>classpath:l

WebMagic爬虫框架及javaEE SSH框架将数据保存到数据库(二)

关于一些基本内容可查看上一篇博客:http://blog.csdn.net/u013082989/article/details/51176073 一.首先看一下爬虫的内容: (1)学科类型.课程.课程对应章节.课程对应参考教材(主要是要将课程章节对应到上一级爬取的课程上,还有就是课程教材的爬取比较麻烦,下面会讲到) 课程章节: 课程教材 教材内容 二.实体类的设计: (1)课程类.课程对应章节类(一对多),课程对应教材类(一对多),关于hibernate映射文件就不说明了. 三.爬取课程及对应

[JavaEE] SSH框架搭建所需要的包

struts2commons-logging-1.0.4.jar 主要用于日志处理freemarker-2.3.8.jar 模板相关操作需要包ognl-2.6.11.jar ognl表达示所需包,xwork-2.0.7.jar xwork核心包struts2-core-2.0.14.jar struts2核心包struts2-spring-plugin-2.0.14.jar struts2整合spring所需要的包如果还需要整合其它框架或者插件,再导入其它的包 hibernateHibernat