如何将自定义 ObjectMapper 序列化程序限制为特定的通用类型
How do you restrict custom ObjectMapper serializer to specific generic type
我想为地图使用自定义序列化程序,但前提是它们是 地图。我尝试按照 中的建议注册一个 StdSerializer<Map,String, String>>
,如下所示:
ObjectMapper om = new ObjectMapper();
SimpleModule maskModule = new SimpleModule();
JavaType mapType =
om.getTypeFactory().constructMapLikeType(Map.class, String.class, String.class);
maskModule.addSerializer(new MapSerializer(mapType));
om.registerModule(maskModule);
我的序列化程序如下所示:
public static class MapSerializer extends StdSerializer<Map<String, String>> {
MapSerializer(JavaType type) {
super(type);
}
@Override
public void serialize(
Map<String, String> value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeStartObject();
for (Map.Entry<String, String> entry : value.entrySet()) {
gen.writeStringField(entry.getKey(), doOtherStuff(entry.getValue()));
}
gen.writeEndObject();
}
}
这在 Map<String, String>
对象上工作正常,但不幸的是它也被调用到其他地图。如何将自定义序列化程序限制为特定泛型类型?
感谢@shmosel 的评论,我发现以下解决方案似乎允许我们使用 SerializerModifier
.
拦截序列化程序分配
public static class MapSerializerModifier extends BeanSerializerModifier {
@Override
public JsonSerializer<?> modifyMapSerializer(SerializationConfig config, MapType valueType, BeanDescription beanDesc, JsonSerializer serializer) {
if(valueType.getKeyType().getRawClass().equals(String.class) &&
valueType.getContentType().getRawClass().equals(String.class)) {
return new MapSerializer();
}
return serializer;
}
}
然后不是直接在模块中注册 MapSerializer
,而是注册修饰符:
SimpleModule maskModule = new SimpleModule();
maskModule.setSerializerModifier(new MapSerializerModifier());
om.registerModule(maskModule);
现在,根据对象的类型属性,针对每个 Map 和 returns 自定义序列化程序或默认序列化程序检查修饰符。
我想为地图使用自定义序列化程序,但前提是它们是 StdSerializer<Map,String, String>>
,如下所示:
ObjectMapper om = new ObjectMapper();
SimpleModule maskModule = new SimpleModule();
JavaType mapType =
om.getTypeFactory().constructMapLikeType(Map.class, String.class, String.class);
maskModule.addSerializer(new MapSerializer(mapType));
om.registerModule(maskModule);
我的序列化程序如下所示:
public static class MapSerializer extends StdSerializer<Map<String, String>> {
MapSerializer(JavaType type) {
super(type);
}
@Override
public void serialize(
Map<String, String> value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeStartObject();
for (Map.Entry<String, String> entry : value.entrySet()) {
gen.writeStringField(entry.getKey(), doOtherStuff(entry.getValue()));
}
gen.writeEndObject();
}
}
这在 Map<String, String>
对象上工作正常,但不幸的是它也被调用到其他地图。如何将自定义序列化程序限制为特定泛型类型?
感谢@shmosel 的评论,我发现以下解决方案似乎允许我们使用 SerializerModifier
.
public static class MapSerializerModifier extends BeanSerializerModifier {
@Override
public JsonSerializer<?> modifyMapSerializer(SerializationConfig config, MapType valueType, BeanDescription beanDesc, JsonSerializer serializer) {
if(valueType.getKeyType().getRawClass().equals(String.class) &&
valueType.getContentType().getRawClass().equals(String.class)) {
return new MapSerializer();
}
return serializer;
}
}
然后不是直接在模块中注册 MapSerializer
,而是注册修饰符:
SimpleModule maskModule = new SimpleModule();
maskModule.setSerializerModifier(new MapSerializerModifier());
om.registerModule(maskModule);
现在,根据对象的类型属性,针对每个 Map 和 returns 自定义序列化程序或默认序列化程序检查修饰符。