【问题标题】:How to ignore only @JsonSerialize annotations in combination with DefaultTyping如何结合 DefaultTyping 仅忽略 @JsonSerialize 注释
【发布时间】:2019-10-31 12:21:40
【问题描述】:

看过很多关于ignoring certain annotations的问答,甚至禁用所有注释:

.configure(MapperFeature.USE_ANNOTATIONS, false)

但是

  1. 第一个解决方案击败了 DefaultTyping(类型不会以序列化的 JSON 和
  2. 结尾
  3. 第二种解决方案破坏了许多有用的注释,其中对我们来说最关键的注释:java.beans.ConstructorProperties

如何忽略 @JsonSerialize 并在生成的 JSON 中仍然有 typeinfo,同时仍然支持其他注释,例如 ConstructorProperties

这是我目前所拥有的:

private static ObjectMapper configureObjectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.PROPERTY);
    mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
        @Override
        protected TypeResolverBuilder<?> _findTypeResolver(MapperConfig<?> config, Annotated ann, JavaType baseType) {
            if (ann.hasAnnotation(JsonSerialize.class) || ann.hasAnnotation(JsonDeserialize.class)) {
                return StdTypeResolverBuilder.noTypeInfoBuilder(); // or null
            }
            return super._findTypeResolver(config, ann, baseType);
        }
    });
    return mapper;
}
// or the same config using a JsonMapper builder

但由于某种原因,这仍然会处理@JsonSerialize。我在杰克逊 2.10.0.pr3 上。


我面临的真正问题是我正在序列化第 3 方对象,其中包含提供的 @JsonSerialize 用于不相关的目的,但没有定义 @JsonDeserialize。即使没有这些注释它们是完全可序列化的,但它们最终会阻止我们的反序列化。同时我不知道它们是哪些类,所以这些应该在生成的 JSON 中编码。此外,其中一些对象是使用 Lombok 生成的,导致使用 java.beans.ConstructorProperties 注释的无参数构造函数,Jackson 在正常情况下可以正常处理。

这是我无法解决的上述配置组合。

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

    您是否尝试过覆盖JacksonAnnotationIntrospector#findSerializer 方法:

    class SkipSerializersJacksonAnnotationIntrospector extends JacksonAnnotationIntrospector {
    
        private final List<Class> classesToSkip = new ArrayList<>();
    
        public SkipSerializersJacksonAnnotationIntrospector() {
            classesToSkip.add(YourClass.class);
        }
    
        @Override
        public Object findSerializer(Annotated a) {
            if (classesToSkip.contains(a.getRawType())) {
                return null;
            }
    
            return super.findSerializer(a);
        }
    }
    

    它应该允许您跳过JsonSerialize 注释并保留类型。

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 2015-08-03
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2021-05-11
      • 2011-11-13
      • 2012-07-16
      • 2011-09-15
      相关资源
      最近更新 更多