java - 序列化@JsonIgnore-d字段

标签 java jackson

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

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

是否可以配置ObjectWriter,使其在序列化期间包含myfield,即使被忽略? 理由:MyClass 在很多地方被序列化,并且只在一个特定的地方我想要 myfield

最佳答案

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

<强>1。 对特定带注释的字段禁用 JsonIgnore 功能。

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

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

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

    @MyJsonIgnore
    private SomeType myField;

}

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

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

实现了自定义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);
    }
}

之后,您可以在配置期间在 ObjectMapper 上设置内省(introspection)器:

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

结果是,用 @MyJsonIgnore 注解的字段可以被正确编码(marshal)。

<强>2。 禁用映射器的 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);

这只是禁用所有注释。

希望这能有所帮助。

关于java - 序列化@JsonIgnore-d字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60044559/

相关文章:

Java 构造函数不会采用正确的参数

Java Arraylist同时改变所有对象中的一个属性值

java - 无法使用 headless (headless)模式 Selenium 定位元素

java - 反序列化通用类 Jackson 或 Gson

json - 如何反序列化空数组/列表?

java - 为什么在Java链表遍历中使用递归不能返回Object?

java - Spring框架,如何在不同的项目中加载 session

java - Jackson:接受任何 json 的属性

java - Jersey/Jackson 仅基类序列化问题

java - 根据 Jersey 的请求查询参数自定义 Jackson 的反序列化?