序列化@JsonIgnore-d字段

Rad*_*icz 7 java jackson

我有课堂课@JsonIgnore-d:

public class MyClass {
    ...
    @JsonIgnore
    private SomeType myfield;
    ...
    // getters & setters
}
Run Code Online (Sandbox Code Playgroud)

是否可以进行配置ObjectWriter,使其myfield在序列化期间包括即使被加入?基本原理:MyClass在许多地方都是序列化的,只有我希望拥有的单一特定的序列化myfield.

Wil*_*son 12

可以配置ObjectMapper为禁用JsonIgnore函数.以下是您可以尝试的一些可能的解决方案:

1.禁用特定注释字段的JsonIgnore函数.

您可以创建自定义JsonIgnore注释和自定义JacksonAnnotationIntrospector以从映射器上下文中删除注释.以下是这些想法:

注释@MyJsonIgnore序列化时应忽略的字段:

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

    @MyJsonIgnore
    private SomeType myField;

}
Run Code Online (Sandbox Code Playgroud)

@MyJsonIgnore包装是一个简单的自定义注释@JsonIgnore:

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonIgnore
public @interface MyJsonIgnore {
}
Run Code Online (Sandbox Code Playgroud)

JacksonAnnotationIntrospector实现自定义以@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以ObjectMapper在配置期间设置introspector :

ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new DisablingMyJsonIgnoreIntrospector());
Run Code Online (Sandbox Code Playgroud)

结果是注释的字段@MyJsonIgnore可以正确编组.

2.禁用映射器的JsonIgnore函数

您可以创建自定义JacksonAnnotationIntrospector和覆盖hasIgnoreMarker方法以始终返回false:

public static class DisablingJsonIgnoreIntrospector extends JacksonAnnotationIntrospector {

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

final ObjectMapper mapper = new ObjectMapper();
mapper.disable(MapperFeature.USE_ANNOTATIONS);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Run Code Online (Sandbox Code Playgroud)

这只是禁用所有注释.

希望这可以提供帮助.