• 使用jackson转json解决双向关联循环调用


    ITOO V1.0的开发算是告一段落了,现在是整理总结交接环节,在这个项目中常见的问题也该好好整理一下和大家分享了,这次主要介绍转json循环调用的问题。

    一、问题背景

    相信只要使用ORM映射实体关联关系,实体中存在双向关联的都遇到过这样的问题:


    其实这个问题在上次的.NET项目中遇到过,所以这个问题是一个常见问题,只不过因为这次实在java中第一次遇到,但是循环调用的原理还是没有改变的。

    二、解决方案

    由于刚java项目的经验不丰富,之前实体关系也没有这次项目中的复杂,所以没有解决过,不过学会站在巨人的肩膀上还是解决问题的一个很好的途径,其实这个问题的解决方案有很多种,这里我选择了一种比较好的:

    1、首先我们需要引入jacksonjar包:

    https://cn.jarfire.org/jackson.all.html

    可在这里下载。

    2、封装转json的工具类:

    1. package itoo.basic.tool.json;
    2. import java.io.PrintWriter;
    3. import javax.servlet.http.HttpServletResponse;
    4. import org.codehaus.jackson.JsonGenerator;
    5. import org.codehaus.jackson.map.ObjectMapper;
    6. /**
    7. * 转换json的工具类
    8. * @author 陈丽娜
    9. * @version 1.0.0 , 2014年12月23日 下午3:24:33
    10. */
    11. public class JacksonJsonUntil{
    12. public JsonGenerator jsonGenerator=null;
    13. public ObjectMapper objectMapper=null;
    14. /**
    15. * 将对象转换为json字符串
    16. * @param response 向前台传递数据时的格式
    17. * @param obj 需要转换的对象(可以为list)
    18. * @throws Exception 异常处理
    19. */
    20. public void beanToJson(HttpServletResponse response,Object obj) throws Exception{
    21. response.setContentType("application/json;charset=UTF-8");//防止数据传递乱码
    22. objectMapper =new ObjectMapper();
    23. try {
    24. String json=objectMapper.writeValueAsString(obj);//将对象转成json
    25. PrintWriter out=response.getWriter();//打印到前台
    26. out.write(json);
    27. } catch (Exception e) {
    28. // TODO: handle exception
    29. e.printStackTrace();
    30. }
    31. }
    32. }


    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解决循环调用的问题,只是避开了循环调用,而不是真正的从根本上解决,希望以后可以解决这个问题。

    原文地址:https://blog.csdn.net/jly4758/article/details/43085613
  • 相关阅读:
    对C++类的继承和派生的理解
    排序算法 之 归并排序
    排序算法 之 冒泡排序
    排序算法 之 选择排序
    排序算法 之 插入排序
    排序算法 之 快速排序
    进程和线程
    C++ 之 强制转换
    C++ 之 智能指针
    C++ STL 之 分配器(allocator)
  • 原文地址:https://www.cnblogs.com/jpfss/p/11059361.html
Copyright © 2020-2023  润新知