【发布时间】:2016-10-30 11:42:27
【问题描述】:
我尝试了几种方法
例如
1.创建自定义JsonSerializer,并重写序列化方法
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("");
}
并将 JsonSerializer 设置为 NullValueSerializer,如下所示:
objectMapper.getSerializerProvider().setNullValueSerializer(new NullStringSerializer());
但我们无法从 null 中获取 Class Type。所有 null 将被转换为 "" ,包括对象。
2.如果使用 SimpleModule
SimpleModule simpleModule = new SimpleModule("StringModule", Version.unknownVersion());
simpleModule.addSerializer(Object.class, new NullStringSerializer());
objectMapper.registerModule(simpleModule);
在序列化方法中,参数值没有任何为空的属性。
从jackson 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 为 null 时,provide 只是将其转换为 null。 并且没有任何界面让我改变策略。
我可以覆盖 MapSerializer ,但我不知道如何将新的 MapSerializer 设置为工厂。
有什么解决办法吗?
期待您的帮助,谢谢!
【问题讨论】:
标签: string dictionary null jackson serialization