• jackson java转json hibernate懒加载造成的无限递归问题


    @JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties

    jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归(infinite recursion)问题。这些标注均可用在属性或对应的get、set方法中。  


    @JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。  

    @JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。


    @JsonIgnoreProperties 用法

    1. //忽略parent models属性
    2. @JsonIgnoreProperties({"parent","models"})
    3. public class Module{
    4. @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
    5. public java.util.List<Module> models;
    6. @ManyToOne(fetch=FetchType.LAZY)
    7. @JoinColumn(name="parent_id",referencedColumnName="id")
    8. public Module parent;
    9. }
    
    
    
    


    @JsonFilter用法

    1. //忽略parent models属性
    2. @JsonFilter("module")
    3. public class Module{
    4. @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
    5. public java.util.List<Module> models;
    6. @ManyToOne(fetch=FetchType.LAZY)
    7. @JoinColumn(name="parent_id",referencedColumnName="id")
    8. public Module parent;
    9. }
    1. 测试代码:
    2. Module module=moduleService.findModuleByName("文件管理");
    3. ObjectMapper mapper=new ObjectMapper();
    4. FilterProvider filterProvider=new SimpleFilterProvider().addFilter("module", SimpleBeanPropertyFilter.serializeAllExcept("parent","models"));
    5. mapper.setFilters(filterProvider);
    6. String resultString=mapper.writeValueAsString(module);

    
    

    
    

    JsonFilter可以动态指定过滤的属性,缺点:每次转换都要设置过滤器,否则会报错,就这点很不爽。既然不爽就换种方式过滤,使用fastjson,请看下面的代码:

    1. package com.company.project.common.util;
    2. import java.util.Map;
    3. import java.util.Map.Entry;
    4. import java.util.Set;
    5. import com.alibaba.fastjson.JSON;
    6. import com.alibaba.fastjson.serializer.JSONSerializer;
    7. import com.alibaba.fastjson.serializer.PropertyFilter;
    8. import com.alibaba.fastjson.serializer.SerializeWriter;
    9. import com.alibaba.fastjson.serializer.SerializerFeature;
    10. public class JsonHelpler {
    11. public static String toJSON(Object o){
    12. return JSON.toJSONString(o,SerializerFeature.WriteMapNullValue);
    13. }
    14. public static SerializeWriter toJSON(Object obj, final Map<Class<?>, Set<String>> includeMap){
    15. PropertyFilter filter = new PropertyFilter() {
    16. @Override
    17. public boolean apply(Object source, String name, Object value) {
    18. for(Entry<Class<?>, Set<String>> entry : includeMap.entrySet()) {
    19. Class<?> class1 = entry.getKey();
    20. if(source.getClass() == class1){
    21. Set<String> fields = entry.getValue();
    22. for(String field : fields) {
    23. if(field.equals(name)){
    24. return false;
    25. }
    26. }
    27. }
    28. }
    29. return true;
    30. } };
    31. SerializeWriter sw = new SerializeWriter();
    32. JSONSerializer serializer = new JSONSerializer(sw);
    33. serializer.getPropertyFilters().add(filter);
    34. serializer.write(obj);
    35. return sw;
    36. }
    37. }
    38. 测试代码
    39. Map<Class<?>, Set<String>> includeMap = new HashMap<Class<?>, Set<String>>();
    40. Set<String> set = new HashSet<String>();
    41. set.add("parent");
    42. set.add("models");
    43. includeMap.put(Module.class, set);
    44. SerializeWriter resultString=JsonHelpler.toJSON(module, includeMap);
    45. System.out.println(resultString);



    原文地址:https://blog.csdn.net/cym19890801/article/details/49660105
  • 相关阅读:
    ios 正则表达式
    2016/2/26 jQuery的技术 1,安装 2,语法选择器$ 事件触发 3,常用jQuery函数
    2016/2/26 <marquee></marquee>实现多种滚动效果
    2016/2/25 onchange 应用
    2016/2/25 1、<表单验证<form></form> 2、正则表达式 3、事件
    2016/2/25 1, margin auto 垂直方向测试 无效 2,margin重叠 3,哪些是块状哪些是内联 4,display:block inline 导航栏把内联转块状最常见+ 扩展
    2016/2/25 html+css学习资源
    2016/2/24 css画三角形 border的上右下左的调整 以及内区域的无限变小 边界透明
    2016/2/24 1,css有几种引入方式 2,div除了可以声明id来控制,还可以声明什么控制? 3,如何让2个div,并排显示。4,清除浮动 clear:left / right / both
    2016/2/24 1,dotctype有几种? 2,了解html的发展历史
  • 原文地址:https://www.cnblogs.com/jpfss/p/11063585.html
Copyright © 2020-2023  润新知