gpt4 book ai didi

java - Jackson - 反序列化为不同类型

转载 作者:行者123 更新时间:2023-12-02 00:23:41 24 4
gpt4 key购买 nike

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

我有一个(Spring MVC)Web 应用程序,它允许用户在脚本中定义步骤,然后该步骤将在客户端应用程序中执行。步骤可能是诸如 ShowDialogStep 之类的内容,其属性如 dialogTextWaitStep 之类,其属性为 duration

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

所以,回顾一下我需要:

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

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

最佳答案

您可以使用这种方法:

在服务器端:

@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

关于java - Jackson - 反序列化为不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10427929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com