【发布时间】:2019-10-31 12:21:40
【问题描述】:
看过很多关于ignoring certain annotations的问答,甚至禁用所有注释:
.configure(MapperFeature.USE_ANNOTATIONS, false)
但是
- 第一个解决方案击败了 DefaultTyping(类型不会以序列化的 JSON 和 结尾
- 第二种解决方案破坏了许多有用的注释,其中对我们来说最关键的注释:
java.beans.ConstructorProperties。
如何忽略 @JsonSerialize 并在生成的 JSON 中仍然有 typeinfo,同时仍然支持其他注释,例如 ConstructorProperties?
这是我目前所拥有的:
private static ObjectMapper configureObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.PROPERTY);
mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
@Override
protected TypeResolverBuilder<?> _findTypeResolver(MapperConfig<?> config, Annotated ann, JavaType baseType) {
if (ann.hasAnnotation(JsonSerialize.class) || ann.hasAnnotation(JsonDeserialize.class)) {
return StdTypeResolverBuilder.noTypeInfoBuilder(); // or null
}
return super._findTypeResolver(config, ann, baseType);
}
});
return mapper;
}
// or the same config using a JsonMapper builder
但由于某种原因,这仍然会处理@JsonSerialize。我在杰克逊 2.10.0.pr3 上。
我面临的真正问题是我正在序列化第 3 方对象,其中包含提供的 @JsonSerialize 用于不相关的目的,但没有定义 @JsonDeserialize。即使没有这些注释它们是完全可序列化的,但它们最终会阻止我们的反序列化。同时我不知道它们是哪些类,所以这些应该在生成的 JSON 中编码。此外,其中一些对象是使用 Lombok 生成的,导致使用 java.beans.ConstructorProperties 注释的无参数构造函数,Jackson 在正常情况下可以正常处理。
这是我无法解决的上述配置组合。
【问题讨论】:
标签: java json serialization jackson