2016-06-28 98 views
0

我已經嘗試了幾種方法jackson serializer cover字符串null爲空String(「」)並保留object null爲空

例如,

1.創建一個自定義JsonSerializer,並重寫序列化方法

@Override 
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 
    gen.writeString(""); 
} 

,並設置JsonSerializer到NullValueSerializer,像這樣:

objectMapper.getSerializerProvider().setNullValueSerializer(new NullStringSerializer()); 

,但我們無法從空類的類型。所有的null都會隱藏「」,包含對象。

2.如果使用SimpleModule

SimpleModule simpleModule = new SimpleModule("StringModule", Version.unknownVersion()); 
simpleModule.addSerializer(Object.class, new NullStringSerializer()); 
objectMapper.registerModule(simpleModule); 

在序列化的方法,該參數值的方式不具有任何性質,這是空。

從傑克遜2.6.0的種源代碼,找到方法在serializeFields MapSerializer.java(我的對象是一個地圖)線:545

for (Map.Entry<?,?> entry : value.entrySet()) { 
      Object valueElem = entry.getValue(); 
      // First, serialize key 
      Object keyElem = entry.getKey(); 
      if (keyElem == null) { 
       provider.findNullKeySerializer(_keyType, _property).serialize(null, gen, provider); 
      } else { 
       // One twist: is entry ignorable? If so, skip 
       if (ignored != null && ignored.contains(keyElem)) continue; 
       keySerializer.serialize(keyElem, gen, provider); 
      } 

      // And then value 
      if (valueElem == null) { 
       provider.defaultSerializeNull(gen); 
      } else {...} 
} 

當valueElem爲空,則提供剛好它隱蔽到空值。 並沒有任何接口讓我改變策略。

我可以重寫MapSerializer,但我不知道如何將新的MapSerializer設置爲工廠。

有沒有解決方法?

期待您的幫助,謝謝!

回答

0

找到解決方案: 抽象類SerializerProvider有一個名爲findNullValueSerializer的方法,該方法被調用以使序列化程序用於序列化指定屬性的空值。 我們可以覆蓋SerializerProvider#findNullValueSerializer和匹配String類:

@Override 
public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException { 
    if (property.getType().getRawClass().equals(String.class)) { 
     return EmptyStringSerializer.INSTANCE; 
    } else { 
     return super.findNullValueSerializer(property); 
    } 
} 

,然後設置SerializerProvider我們ObjectMapper實例。

完成。

相關問題