如何将自定义 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 自定义序列化程序或默认序列化程序检查修饰符。