2016-06-28 56 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实例。

完成。

相关问题