使用Jackson,我如何使用一组类对一个应用程序进行JSON序列化/反序列化,但是让另一个应用程序反序列化相同的JSON并加载这些类的不同实现?
我有一个(Spring MVC)Web应用程序,允许用户在脚本中定义步骤,然后在客户端应用程序中执行。步骤可能是ShowDialogStep
,其中包含dialogText
或WaitStep
等属性,其属性为duration
。
客户端应用程序将从服务器加载步骤集合。但是,客户端实例化的类需要具有特定于执行的功能,如execute()
,在WaitStep
的情况下,它将跟踪等待它的程度。显然,服务器端应用程序永远不需要知道这一点,并且在不太重要的示例中,步骤的执行/更新逻辑涉及各种特定于客户端的依赖性。
所以,回顾一下我需要:
这是否可以在客户端映射器上配置,也许如果JSON使用相对类名称(而不是完全限定)进行序列化,则可以将反序列化器配置为查看实现的不同包中包含执行逻辑?
答案 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