[英]Tell Jackson to ignore a property that is a array/collection of a specific type
[英]How to tell Jackson not to include collection type information?
我遇到了“多态反序列化问题”,因此我正在配置杰克逊,以将非混凝土类的类型信息添加为属性,如下所示:
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
.withFieldVisibility(JsonAutoDetect.Visibility.NONE)
.withGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withSetterVisibility(JsonAutoDetect.Visibility.NONE)
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE)
.withIsGetterVisibility(JsonAutoDetect.Visibility.NONE))
mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_CONCRETE_AND_ARRAYS, "__class__")
它运作良好,但是对于集合实例(例如List),它创建了一个由两个元素组成的数组,第一个位置包含一个字符串,该字符串包含集合的类型信息(java.util.ArrayList)。
这会影响客户端(Javascript)期望的json的结构,因为它期望的是数组,现在在第二个位置的内部有另一个数组。
我希望Jackson仅为非集合而不是具体类型插入类型信息,因为框架本身不需要集合实现类型即可正确反序列化集合属性。
这可能以可配置的方式吗?
您可以创建ObjectMapper.DefaultTypeResolverBuilder
的自定义版本,并覆盖useForType()方法。
这是默认方法的实现:
public boolean useForType(JavaType t)
{
switch (_appliesFor) {
case NON_CONCRETE_AND_ARRAYS:
while (t.isArrayType()) {
t = t.getContentType();
}
// fall through
case OBJECT_AND_NON_CONCRETE:
return (t.getRawClass() == Object.class) || !t.isConcrete();
case NON_FINAL:
while (t.isArrayType()) {
t = t.getContentType();
}
return !t.isFinal(); // includes Object.class
default:
//case JAVA_LANG_OBJECT:
return (t.getRawClass() == Object.class);
}
}
在您的版本中,只需添加此前提条件
if (t.isCollectionLikeType()) {
return false;
}
告诉Jackson跳过类似于Collection的类型以插入类型信息。
并使用ObjectMapper.setDefaultTyping(myCustomTyper);
设置新的TypeResolverBuilder
ObjectMapper.setDefaultTyping(myCustomTyper);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.