2016-11-26 100 views
0

在序列化MyObject時,我想在運行時決定屬性類中包含或不包含空屬性。什麼是最好的方法來做到這一點?在運行時設置序列化屬性

import com.fasterxml.jackson.annotation.JsonInclude; 
import lombok.Data; 

@Data 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class MyObject { 
    private String property1; 
    private DateTime property2; 
    private Attributes attributes; 
} 

@Data 
public class Attributes { 
    private String property1; 
    private String property2; 
} 

回答

0

你可以改變這種行爲的映射:

if (noNull) { 
    mapper.setSerializationInclusion(Include.NON_NULL); 
} else { 
    mapper.setSerializationInclusion(Include.ALWAYS); 
} 
+0

但我需要做條件包括null只在'Attributes'類中,而不在'MyObject'類中。 – Shikhar

1

如果使用的是傑克遜2.8,你可以使用新的「配置覆蓋」功能(在高級別討論f.ex here) ,指定相當於註釋的,就像這樣:

mapper.configOverride(Attributes.class) 
    // first value for value itself (POJO); second value only relevant 
    // for structured types like Map/Collection/array/Optional 
    .setInclude(JsonInclude.Value.construct(Include.NON_NULL, null)); 

(與其他幾個方面以前只可使用註釋一起)

但是,請注意,與註釋一樣,此設置不是在初始設置後可以更改的設置:它必須定義爲ObjectMapper一次,並且進一步的更改不會生效。 如果您需要配置不同的映射器,則需要創建不同的實例。

1

有幾種可能性,這取決於您的運行時決策控制所需的細粒度。

  • 如果的行爲是完全自定義在運行時,您可以使用自己的自定義過濾器,可以做複雜的決定,要麼序列字段或不是。過濾器會是這個樣子:

    PropertyFilter myFilter = new SimpleBeanPropertyFilter() { 
        @Override public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) throws Exception { 
    
         boolean needsSerialization = needsSerializationBasedOnAdvancedRuntimeDecision((MyValueObject) pojo, writer.getName()); 
    
          if (needsSerialization){ 
           writer.serializeAsField(pojo, jgen, provider); 
          } 
    
        } 
    
        @Override protected boolean include(BeanPropertyWriter writer) { return true; } 
        @Override protected boolean include(PropertyWriter writer) { return true; } 
    }; 
    

    如果您的序列決定,可在財產屬性的基礎上進行處理,例如:

    private boolean needsSerializationBasedOnAdvancedRuntimeDecision(MyValueObject myValueObject, String name) { 
        return !"property1".equals(name) || (myValueObject.getProperty1() == null && property1NullSerializationEnabled); 
    } 
    

    ,您就可以申請你想如下過濾器:

    FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", myFilter); 
    
    String json = new ObjectMapper().writer(filters).writeValueAsString(myValueObject); 
    
  • 如果行爲是一類的屬性相同,標註該屬性@JsonInclude(JsonInclude.Include.NON_NULL)

    ​​
  • 如果的行爲是一個完整的類相同的(例如屬性),配置類,無論是與@JsonInclude(JsonInclude.Include.NON_NULL)或與配置覆蓋StaxMan描述

    @JsonInclude(JsonInclude.Include.NON_NULL) 
    public class Attributes { 
        private String property1; 
        private String property2; 
    } 
    
  • 如果行爲是當前映射所有類相同的:配置映射,如franjavi