杰克逊默认解析为一个子类

汤玛斯·杜豪克:

我有一个称为Product的类和一些扩展它的子类。现在在我的注释中,我有很多类型,如下所示:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({@Type(value=RoomProduct.class, name="RoomProduct"),
           @Type(value=GroundProduct.class, name="GroundProduct"),
           })

然后定义我的Product类。我想做的是,如果Jackson无法检测到该字段不符合任何这些结构,则返回

未知产品

我该如何使用Jackson @Type注释呢?它应该像是在名称中插入空白或在我实际上不知道的值中添加一些标志(我尝试创建扩展了Product的UnknownProduct,并且在名称值中未成功放置任何内容。

Ilya Ovesnov:

@JsonTypeInfo有一个选项可以指定默认的实现类,但是在进行一些调试后,我发现WrapperObject的“ defaultImpl”已损坏。组态:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.WRAPPER_OBJECT, defaultImpl = UnknownProduct.class)

杰克逊实现(AsWrapperTypeDeserializer):

public AsWrapperTypeDeserializer(JavaType bt, TypeIdResolver idRes,
        String typePropertyName, boolean typeIdVisible, Class<?> defaultImpl)
{
    super(bt, idRes, typePropertyName, typeIdVisible, null);
}

请注意,传递了“ defaultImpl”,但它将被忽略,并且不会使用配置的默认类。我在杰克逊(Jackson)的吉拉(Jira)中找不到解决此问题的记录的票证。

仅对于WRAPPER_OBJECT这是一个问题,defaultImpl对于其他格式也可以正常工作。但是它将更改JSON格式。如果可以更改,则可以使用EXTERNAL_PROPERTY作为默认实现:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type", defaultImpl = UnknownProduct.class)

另一个解决方案:如果必须使用WRAPPER_OBJECT,则可以配置Jackson找不到未知的SubType时不失败:

objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);

它与您的要求不完全相同,但是在这种情况下,您的产品将为空。可能您可以将null视为未知产品。

我提交了杰克逊错误的更新https : //github.com/FasterXML/jackson-databind/issues/656

更新此票证已针对2.3和2.4杰克逊解决,希望当将jars重新安装到maven存储库或新版本中时,您应该能够使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

解析JSON使用杰克逊:我们可以在一个POJO可选变量

杰克逊多态性:如何将多个子类型映射到同一类

基于另一个字段映射JSON字段(为一个值),使用杰克逊(这是一个键)

杰克逊XML解析

杰克逊-递归解析为Map <String,Object>

捕获和处理异常杰克逊用一个自定义消息

杰克逊解串器委托给一个适用的解串器

映射一个JSON字符串与杰克逊对象将抛出MismatchedInputException

杰克逊-反序列化一个基本枚举

杰克逊在春季启动错误序列化一个ZonedDateTime

如何序列化一个列表的内容与杰克逊平坦JSON对象?

传递一个手动的内容创建的JSONObject杰克逊

如何获得一个类,杰克逊的看法它的属性列表?

如何声明另一个杰克逊ObjectMapper不影响原豆的“客户”?

杰克逊:如果有多个串行器,则使用哪一个?

杰克逊无法使用一个参数构造器构造实例

杰克逊的平面 JSON 用于一个字段的类/记录

杰克逊序列化简单的一个属性ValueObject像枚举-不嵌套

杰克逊-在数组中获取一个条目

如何将几个参数移动到杰克逊的另一个节点?

使用杰克逊从json数组中检索一个值

杰克逊坚持要映射一个未知的财产

杰克逊在同一个POJO中映射不同的展开元素

有关逗号杰克逊CSV解析器扼流圈分隔值的文件,如果“”是一个域,即使使用引号“

假设字段没有条件为空,如何告诉杰克逊忽略一个字段?

从杰克逊的一个对象到另一个对象的属性的深层复制?

杰克逊ObjectMapper默认属性顺序

杰克逊设置默认视图

用杰克逊解析对象列表