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