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

javaEE SSH框架对象转json问题_第1张图片


二、解决方法

(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)测试成功,学生、部门、班级

四、总结

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


你可能感兴趣的:(json,Ajax,数据,ssh,溢出)