如何仅结合使用@JsonSerialize注释和DefaultTyping

时间:2019-10-31 12:21:40

标签: java json serialization jackson

我已经看到有关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上。


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

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

1 个答案:

答案 0 :(得分:0)

您是否尝试覆盖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注释并保持键入。