jackson 序列化@JsonIgnore-d字段

eqzww0vc  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(101)

我有一个@JsonIgnore-d字段的类:

public class MyClass {
    ...
    @JsonIgnore
    private SomeType myfield;
    ...
    // getters & setters
}

是否可以配置ObjectWriter,以便在序列化期间包括myfield(即使被忽略)?理由:MyClass在许多地方被序列化,并且只在一个特定的地方,我想有myfield

ugmeyewa

ugmeyewa1#

可以配置ObjectMapper来禁用JsonIgnore函数。以下是一些可以尝试的解决方案:

1.为特定注解字段禁用JsonIgnore函数。

您可以创建一个自定义JsonIgnore注解和一个自定义JacksonAnnotationIntrospector,以便从Map器上下文中删除注解。
@MyJsonIgnore注解为序列化时应忽略的字段:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class MyClass {

    @MyJsonIgnore
    private SomeType myField;

}

@MyJsonIgnore是一个简单自定义注解,它包含@JsonIgnore

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonIgnore
public @interface MyJsonIgnore {
}

实现自定义JacksonAnnotationIntrospector以从Map器上下文中删除@MyJsonIgnore

public class DisablingMyJsonIgnoreIntrospector extends JacksonAnnotationIntrospector {

@Override
public boolean isAnnotationBundle(final Annotation ann) {
    if (ann.annotationType().equals(MyJsonIgnore.class)) {
        return false;
    } else {
        return super.isAnnotationBundle(ann);
    }
}

之后,您可以在配置过程中设置ObjectMapper上的自检器:

ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new DisablingMyJsonIgnoreIntrospector());

结果是可以正确封送使用@MyJsonIgnore注解的字段。

2.禁用Map器的JsonIgnore函数

您可以创建一个自定义JacksonAnnotationIntrospector并覆盖hasIgnoreMarker方法以始终返回false

public static class DisablingJsonIgnoreIntrospector extends JacksonAnnotationIntrospector {

    @Override
    public boolean hasIgnoreMarker(final AnnotatedMember m) {
        return false;
    }

}

hasIgnoreMarker是检查是否有注解忽略json属性,返回false将禁用JsonIngore函数。

3.禁用所有注解并指定为给定ObjectMapper自动检测哪些类型的属性:

final ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.USE_ANNOTATIONS);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

这只是禁用所有注解。
希望这能有所帮助。

jqjz2hbq

jqjz2hbq2#

如果你想在pojo中避免包含@JsonIgnore在内的所有Jackson注解,还有一个选择是使用AnnotationIntrospector.nopInstance()。

JsonMapper.builder().annotationIntrospector(AnnotationIntrospector.nopInstance()).build()...

new ObjectMapper().setAnnotationIntrospector(AnnotationIntrospector.nopInstance())...

相关问题