繁体   English   中英

如何告诉杰克逊不包括收集类型信息?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM