禁用Jackson映射器以获取特定注释

yve*_*lem 6 java json annotations jackson

使用Jackson,可以轻松禁用给定的所有注释ObjectMapper.有没有办法只禁用一个给定的注释?

// disable all
ObjectMapper mapper = new ObjectMapper()
mapper.disable(MapperFeature.USE_ANNOTATIONS);

// disable one?
ObjectMapper mapper = new ObjectMapper()
mapper.disable(@JsonIgnore);
Run Code Online (Sandbox Code Playgroud)

使用@JacksonAnnotationsInside,我已经定义了一个自定义杰克逊注释,我只希望它在某些情况下使用.

755*_*755 2

这是我遇到过的最好的。我想我在杰克逊用户组论坛的某个地方看到过它。

本质上,它创建了一个自定义注释内省器,如果它发现它具有特定注释(在本例中为 JsonTypeInfo),则返回 null

JacksonAnnotationIntrospector ignoreJsonTypeInfoIntrospector = new JacksonAnnotationIntrospector() {
            @Override
            protected TypeResolverBuilder<?> _findTypeResolver(
                    MapperConfig<?> config, Annotated ann, JavaType baseType) {
                if (!ann.hasAnnotation(JsonTypeInfo.class)) {
                    return super._findTypeResolver(config, ann, baseType);
                }
                return null;
            }
        };

        mapper.setAnnotationIntrospector(ignoreJsonTypeInfoIntrospector);
Run Code Online (Sandbox Code Playgroud)

  • 关于此解决方案的一个重要注意事项:您应该返回 StdTypeResolverBuilder.noTypeInfoBuilder(),而不是返回 null。就我而言,我在泽西岛使用 Jackson 作为 JSON 处理器。当使用某些 Jersey 功能(例如,EntityFiltering)时,序列化为 JSON 的处理工作流程在注释内省器阶段不会按预期运行。在我的具体情况下,当 findTypeResovler 返回 null 时,Jersey Filtering 使用其“辅助”注释内省器成功序列化 JsonTypeInfo (2认同)