当前位置: 首页 > 知识库问答 >
问题:

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

殷宇
2023-03-14

对于多态脱串化,杰克逊的对象映射器想知道:

    < li >可以考虑哪些子类型 < li >如何决定使用哪个子类型

有一些标准的方法,使用完全限定的类名和某些保留的JSON属性,所以Jackson不用进一步配置就可以推导出那些东西。

另一种常见的方法是,通过向基类型添加注释@JsonTypeInfo@JsonSubtype来向Jackson提供必要的信息。然而,这意味着,在添加新子类型时,声明基类的文件必须被修改。

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

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

类似< code > object mapper . add type info(new type info(base type . class,PROPERTY," myPropertyName ",NAME);所以我可以在另一个项目中声明的类型上使用多态反序列化,该项目对Jackson或其任何注释一无所知。

共有1个答案

澹台阳秋
2023-03-14

要注册< code>@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 {
}

必须为对象映射器手动注册 mixin:

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

BaseType现在有效地拥有来自mixin的< code>@JsonTypeInfo。jackson中的Mixin是“我如何注释一个我不能修改的类”这个问题的一般解决方案。

对于子类型,可以使用<code>ObjectMapper注册类型信息。registerSubtypes</code>或用<code>@JsonSubtypes>注释mixin。在这种情况下,我更喜欢在没有注释的情况下进行,因为如果不同的模块具有基本类型的不同子类型,它也可以工作。注册多个mixin很可能不起作用。

public class SubTypeA extends BaseType {
   ...
}

public class SubTypeB extends BaseType {
    ...
}

在对象映射器中注册:

objectMapper.registerSubtypes(
   new NamedType(SubTypeA.class, "A"), 
   new NamedType(SubTypeB.class, "B"));
 类似资料:
  • 我在Android中以编程方式设置APN。当我运行代码时,我得到。如果我在清单中提到这个权限,我得到的错误就像这些权限只有SYSTEM APPS。你能帮我解决这个问题吗?参考链接

  • 问题内容: 我看到了一些示例代码,它们将相同的OnClick事件分配给Android中的所有按钮(即使它们执行的动作完全不同)。如何用Swift做 Android示例: 注意:我不想以编程方式创建按钮。 问题答案: 在iOS上,您没有设置监听器;你添加一个目标(物体)和行动(方法签名,在iOS的说法“选择”)将(这是一个子类): 在这种情况下,第一个参数是目标对象。该操作是一个选择器(方法签名),

  • 问题内容: 如何确保从hibernate.cfg.xml加载所有属性,然后以编程方式添加其他属性?我看到了以下代码片段,但它看起来像是全新的配置,而不是现有配置的补充。 问题答案: 您显示的代码段是您所需要的。只需使用您现有的配置,而不是创建一个新的配置即可。 如果不是您实例化配置(例如,spring),则需要扩展创建它的类。

  • 我试图在我的应用程序中使用模拟位置进行测试。要接收位置更新,我使用最新的Android开发者留档在这里:https://developer.android.com/training/location/receive-location-updates 本教程使用FusedLocationProviderClient和locationClient。requestLocationUpdates(crea

  • 问题内容: 我正在尝试在应用程序启动期间进行设置,但似乎为时已晚,非无头模式已经启动: 除此之外,还有另一种方法让无头为真吗?我不希望在控制台上进行任何配置。 问题答案: 我正在使用一个类,该类在常量(和其他静态代码)中静态加载JFreeChart的不同部分。 将静态加载块移到类的顶部解决了我的问题。 这不起作用: 通过将Java移动到类的顶部,让Java尽早执行该静态块! 当考虑它时,这是完全有

  • 在WooCommerce中,我试图找到一种类似于方法或的方法,例如,设置产品类型,如简单或变化。 实际上,我使用的是对象如下: 如果用户选中“简单产品”或“可变产品”,我如何设置产品类型? 任何帮助都很感激。