gpt4 book ai didi

java - 序列化@JsonIgnore-d字段

转载 作者:行者123 更新时间:2023-12-01 18:35:56 25 4
gpt4 key购买 nike

我有一个带有 @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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com