杰克逊序列化器覆盖字符串null为空String(“"),并保持对象null为null [英] jackson serializer cover String null to empty String("") and keep object null is null
问题描述
我尝试了几种方法
例如
1.创建一个自定义JsonSerializer,并覆盖序列化方法
1.create a custom JsonSerializer, and override serialize method
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("");
}
并将JsonSerializer设置为NullValueSerializer,如下所示:
and set the JsonSerializer to NullValueSerializer,like this:
objectMapper.getSerializerProvider().setNullValueSerializer(new NullStringSerializer());
,但我们无法从null获取类类型.所有null都将隐藏为",包括对象.
but we can not get the Class Type from null. All null will be covert to "" , include the object.
2.if使用SimpleModule
2.if use SimpleModule
SimpleModule simpleModule = new SimpleModule("StringModule", Version.unknownVersion());
simpleModule.addSerializer(Object.class, new NullStringSerializer());
objectMapper.registerModule(simpleModule);
在serialize方法中,param值没有任何为空的属性.
in the serialize method, the param value do not have any properties which is null.
从杰克逊2.6.0的资源代码中,在MapSerializer.java中找到方法serializeFields
(我的对象是地图):545
from the resouce code of jackson 2.6.0 , find method serializeFields
in MapSerializer.java (my object is a map) line: 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为null时,提供者仅将其隐瞒为null. 并且没有任何界面可供我更改策略.
when the valueElem is null, the provide just covert it to null. and do not have any interface for me to change the strategy.
我可以覆盖MapSerializer,但是我不知道如何将新的MapSerializer设置为出厂.
I can override MapSerializer ,but I do not know how to set the new MapSerializer to the factory.
有什么解决办法吗?
期待您的帮助,谢谢!
推荐答案
找到一个解决方案:
抽象类SerializerProvider
具有一个名为findNullValueSerializer
的方法,该方法被调用以获取序列化程序,该序列化程序用于序列化指定属性的空值.
我们可以覆盖SerializerProvider#findNullValueSerializer
并匹配String类:
find a solution :
the abstract class SerializerProvider
has a method named findNullValueSerializer
, which is called to get the serializer to use for serializing null values for specified property.
We can override SerializerProvider#findNullValueSerializer
and match String class:
@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实例.
and then set SerializerProvider to our ObjectMapper instance.
完成.
这篇关于杰克逊序列化器覆盖字符串null为空String(“"),并保持对象null为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!