在Jackson中以编程方式设置类型鉴别器

derM:

对于多态反序列化,Jackson的ObjectMapper想知道:

  1. 有哪些子类型要考虑
  2. 如何决定要使用的子类型

有一些标准方法,使用完全限定的类名和某些保留的JSON属性,因此Jackson无需进一步配置即可推断出这些内容。

另一种常见的方法是,通过将Annotations @JsonTypeInfo@JsonSubtypes基本类型添加到Jackson,以提供必要的信息但是,这意味着,无论何时添加新的子类型,都必须修改声明基类的文件。

也可以在运行时通过编程方式将子类型注册到ObjectMapper objectMapper.registerSubtypes(...)

现在,我正在寻找一种在不使用该注释的情况下在运行时以编程方式提供@JsonTypeInfo信息的方法。

objectMapper.addTypeInfo(new TypeInfo(BaseType.class, PROPERTY, "myPropertyName", NAME);这样的事情我可以对另一个项目中声明的类型使用多态反序列化,而该项目对Jackson或其任何注释一无所知。

x4rf41:

要注册@JsonTypeInfo而不修改实际的类,您必须使用mixin,如下所示:

// actual base type that we don't want to or can't modfiy 
// because it is in a different module / 3rd party
public class BaseType {  
    ...
}

// mixin for BaseType to define @JsonTypeInfo
// this can be in a completely different package / module
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY, property = "type")
public abstract class BaseTypeMixIn {
}

必须为ObjectMapper手动注册mixin:

objectMapper.addMixIn(BaseType.class, BaseTypeMixIn.class);

BaseType现在有效地@JsonTypeInfo来自mixin。杰克逊的Mixin是解决“如何注释无法修改的类”的一般解决方案。

对于子类型,可以在上注册类型信息,也可以在上ObjectMapper.registerSubtypes标注mixin @JsonSubtypes在这种情况下,我更喜欢不使用注释,因为如果不同的模块具有不同的基本类型子类型,那么它也可以使用。注册多个mixin很可能无法正常工作。

public class SubTypeA extends BaseType {
   ...
}

public class SubTypeB extends BaseType {
    ...
}

在ObjectMapper中注册:

objectMapper.registerSubtypes(
   new NamedType(SubTypeA.class, "A"), 
   new NamedType(SubTypeB.class, "B"));

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章