標籤:.json ignore cas mapped str add 測試 any sim
@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 用法
[java] view plain copy
- //忽略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用法
[java] view plain copy
- //忽略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;
- }
[java] view plain copy
- 測試代碼:
- 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,請看下面的代碼:
[java] view plain copy
- 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() {
- @Override
- public 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);
hibernate懶載入導致jackjson解析json時StackOverFlow