jackson java转json hibernate懒加载造成的无限递归问题
来源:互联网 发布:php项目进度管理系统 编辑:程序博客网 时间:2024/05/01 07:15
@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 用法
//忽略parent models属性@JsonIgnoreProperties({"parent","models"})public class Module{ @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE) public java.util.List<Module> models; @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="parent_id",referencedColumnName="id") public Module parent;}
@JsonFilter用法
//忽略parent models属性@JsonFilter("module")public class Module{ @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE) public java.util.List<Module> models; @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="parent_id",referencedColumnName="id") public Module parent;}
测试代码:Module module=moduleService.findModuleByName("文件管理");ObjectMapper mapper=new ObjectMapper();FilterProvider filterProvider=new SimpleFilterProvider().addFilter("module", SimpleBeanPropertyFilter.serializeAllExcept("parent","models"));mapper.setFilters(filterProvider);String resultString=mapper.writeValueAsString(module);
JsonFilter可以动态指定过滤的属性,缺点:每次转换都要设置过滤器,否则会报错,就这点很不爽。既然不爽就换种方式过滤,使用fastjson,请看下面的代码:
package com.company.project.common.util;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.JSONSerializer;import com.alibaba.fastjson.serializer.PropertyFilter;import com.alibaba.fastjson.serializer.SerializeWriter;import com.alibaba.fastjson.serializer.SerializerFeature;public class JsonHelpler {public static String toJSON(Object o){return JSON.toJSONString(o,SerializerFeature.WriteMapNullValue);} public static SerializeWriter toJSON(Object obj, final Map<Class<?>, Set<String>> includeMap){ PropertyFilter filter = new PropertyFilter() {@Overridepublic boolean apply(Object source, String name, Object value) {for(Entry<Class<?>, Set<String>> entry : includeMap.entrySet()) { Class<?> class1 = entry.getKey(); if(source.getClass() == class1){ Set<String> fields = entry.getValue(); for(String field : fields) { if(field.equals(name)){ return false; } } } }return true; } };SerializeWriter sw = new SerializeWriter(); JSONSerializer serializer = new JSONSerializer(sw);serializer.getPropertyFilters().add(filter);serializer.write(obj);return sw; } }测试代码Map<Class<?>, Set<String>> includeMap = new HashMap<Class<?>, Set<String>>();Set<String> set = new HashSet<String>();set.add("parent");set.add("models");includeMap.put(Module.class, set);SerializeWriter resultString=JsonHelpler.toJSON(module, includeMap);System.out.println(resultString);
1 0
- jackson java转json hibernate懒加载造成的无限递归问题
- jackson java转json hibernate 造成的堆栈溢出 无限递归问题
- jackson的循环问题和hibernate懒加载问题
- hibernate无限递归问题
- 解决spring mvc +hibernate整合时使用jackson返回json数据无限循环问题的官方解决方案
- jackson json数据过滤,用于hibernate的懒加载对象级联关系的json解析
- 省市区级联选择时,jackson 序列化这个对象出现无限递归的问题
- Java-互相关联的实体无限递归问题
- jackson实现Java对象与json的互转
- 使用Jackson转换java对象为Json数据时,Json循环的问题
- Jackson实现json与java的转化
- JackSon转换Java的Json使用方法
- java json解析-jackson
- java json解析-jackson
- java json解析-jackson
- 使用Jackson解析json配合Hibernate报错的解决方法
- 彻底解决hibernate懒加载转json
- hibernate的懒加载问题
- sift 算法理解
- 对NSURLConnection的简单封装
- 子树(LintCode)
- Fedora 23 下安装 Hadoop 2.6.2
- Java代码规范
- jackson java转json hibernate懒加载造成的无限递归问题
- POJ2503Babelfish(MAP+字典树)
- Android Studio使用Robolectric对android程序实现单元测试
- 将一个十六进制字符串转换为十进制数值的问题
- 课时6:PrepareStatement语句
- 气泡
- 批量上传图片时的限制
- [OpenJudge-NOI]词典 stl
- 延迟函数setTimeout()和setInterval()