使用jackson转json解决双向关联循环调用
2015-01-24 15:27
323 查看
ITOO V1.0的开发算是告一段落了,现在是整理总结交接环节,在这个项目中常见的问题也该好好整理一下和大家分享了,这次主要介绍转json循环调用的问题。
其实这个问题在上次的.NET项目中遇到过,所以这个问题是一个常见问题,只不过因为这次实在java中第一次遇到,但是循环调用的原理还是没有改变的。
1、首先我们需要引入jackson的jar包:
https://cn.jarfire.org/jackson.all.html
可在这里下载。
2、封装转json的工具类:
3、在多对多关系的实体中加入注解:
这里不再以单个的实体为例,用到的注解是:
(1)排除属性
@JsonIgnore,一般标记在属性或方法上;作用于序列化与反序列化;
@JsonIgnoreProperties,如果是代理类,由于无法标记在属性或方法上,所以,可以标记在类声明上;也作用于反序列化时的字段解析;
还有当使用hibernate的时候,查询数据库后产生的实体类是个代理类,这时候转换JSON会报错;
解决方法有两种:
1)设置FAIL_ON_EMPTY_BEANS属性,告诉Jackson空对象不要抛异常;
mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
2)使用@JsonIgnoreProperties注解
在实体类声明处加上@JsonIgnoreProperties(value = {"hibernateLazyInitializer","handler"})注解;
建议使用@JsonIgnoreProperties注解,这样生成的JSON中不会产生多余的字段;
一、问题背景
相信只要使用ORM映射实体关联关系,实体中存在双向关联的都遇到过这样的问题:其实这个问题在上次的.NET项目中遇到过,所以这个问题是一个常见问题,只不过因为这次实在java中第一次遇到,但是循环调用的原理还是没有改变的。
二、解决方案
由于刚java项目的经验不丰富,之前实体关系也没有这次项目中的复杂,所以没有解决过,不过学会站在巨人的肩膀上还是解决问题的一个很好的途径,其实这个问题的解决方案有很多种,这里我选择了一种比较好的:1、首先我们需要引入jackson的jar包:
https://cn.jarfire.org/jackson.all.html
可在这里下载。
2、封装转json的工具类:
package itoo.basic.tool.json; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.ObjectMapper; /** * 转换json的工具类 * @author 陈丽娜 * @version 1.0.0 , 2014年12月23日 下午3:24:33 */ public class JacksonJsonUntil{ public JsonGenerator jsonGenerator=null; public ObjectMapper objectMapper=null; /** * 将对象转换为json字符串 * @param response 向前台传递数据时的格式 * @param obj 需要转换的对象(可以为list) * @throws Exception 异常处理 */ public void beanToJson(HttpServletResponse response,Object obj) throws Exception{ response.setContentType("application/json;charset=UTF-8");//防止数据传递乱码 objectMapper =new ObjectMapper(); try { String json=objectMapper.writeValueAsString(obj);//将对象转成json PrintWriter out=response.getWriter();//打印到前台 out.write(json); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
3、在多对多关系的实体中加入注解:
这里不再以单个的实体为例,用到的注解是:
(1)排除属性
@JsonIgnore,一般标记在属性或方法上;作用于序列化与反序列化;
@JsonIgnoreProperties,如果是代理类,由于无法标记在属性或方法上,所以,可以标记在类声明上;也作用于反序列化时的字段解析;
还有当使用hibernate的时候,查询数据库后产生的实体类是个代理类,这时候转换JSON会报错;
解决方法有两种:
1)设置FAIL_ON_EMPTY_BEANS属性,告诉Jackson空对象不要抛异常;
mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
2)使用@JsonIgnoreProperties注解
在实体类声明处加上@JsonIgnoreProperties(value = {"hibernateLazyInitializer","handler"})注解;
建议使用@JsonIgnoreProperties注解,这样生成的JSON中不会产生多余的字段;
三、总结
jackson解决循环调用的问题,只是避开了循环调用,而不是真正的从根本上解决,希望以后可以解决这个问题。相关文章推荐
- 使用jackson转json解决双向关联循环调用
- hibernate双向关联和json-lib使用的死循环问题的解决
- 解决spring mvc +hibernate整合时使用jackson返回json数据无限循环问题的官方解决方案
- 完美解决json循环问题(使用javassist增强):Spring MVC中使用jackson的MixInAnnotations方法动态过滤JSON字段
- 完美解决json循环问题(使用javassist增强):Spring MVC中使用jackson的MixInAnnotations方法动态过滤JSON字段
- springboot 使用hibernate进行双向关联json解析时死循环处理
- 【Java】使用Json-lib序列化关联对象的异常解决
- 关于json-lib 和hibernate一起使用的时候出现死循环的解决办法
- ASP.NET MVC 解决JSON循环调用的问题
- springmvc项目使用fastjson作为json处理器时出现重复引用、循环引用的解决办法
- 使用双向循环链表解决约瑟夫问题
- json返回hibernate的结果会自动调用(get)查询出关联表的数据,解决方法
- 关于json-lib 和hibernate一起使用的时候出现死循环的解决办法
- 问题:在程序中保存数据到索引库,发生异常jackson数据转换异常,造成死循环栈溢出 解决@JsonIgnore注解
- 使用Jackson转换java对象为Json数据时,Json循环的问题
- Hibernate双向关联转Json死循环问题(Gson)
- 使用hibernate解析json时死循环问题解决
- 递归算法:解决hibernate实体外键关联,导致json解析死循环!
- 解决json,There is a cycle in the hierarchy,只循环到某一个关联层
- 解决使用Jackson的@JsonFormat注解出现时间错误情况