杰克逊 - 反序列化为不同类型

时间:2012-05-03 08:44:20

标签: java json spring-mvc polymorphism jackson

使用Jackson,我如何使用一组类对一个应用程序进行JSON序列化/反序列化,但是让另一个应用程序反序列化相同的JSON并加载这些类的不同实现?

我有一个(Spring MVC)Web应用程序,允许用户在脚本中定义步骤,然后在客户端应用程序中执行。步骤可能是ShowDialogStep,其中包含dialogTextWaitStep等属性,其属性为duration

客户端应用程序将从服务器加载步骤集合。但是,客户端实例化的类需要具有特定于执行的功能,如execute(),在WaitStep的情况下,它将跟踪等待它的程度。显然,服务器端应用程序永远不需要知道这一点,并且在不太重要的示例中,步骤的执行/更新逻辑涉及各种特定于客户端的依赖性。

所以,回顾一下我需要:

  • 将“原型”类映射到JSON的服务器应用程序;
  • 客户端应用程序读取相同的 JSON,但实例化特定于执行的类而不是“原型”类。

这是否可以在客户端映射器上配置,也许如果JSON使用相对类名称(而不是完全限定)进行序列化,则可以将反序列化器配置为查看实现的不同包中包含执行逻辑?

1 个答案:

答案 0 :(得分:3)

您可以使用此方法:

在服务器端:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
      include=JsonTypeInfo.As.PROPERTY, property="@type")
class Prototype {
...
}

objectMapper.registerSubtypes(
            new NamedType(Prototype.class, "Execution"),
            ...
);

然后它会序列化一个Prototype实例并添加一种bean:

{
  "@type" : "Execution",
  ...
}

在客户端:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
      include=JsonTypeInfo.As.PROPERTY, property="@type")
class Execution {
...
}

objectMapper.registerSubtypes(
            new NamedType(Execution.class, "Execution"), // the same name
    ....
);
objectMapper.readValue(....); // will be deserialized to an Execution instance