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

标签 java json spring-mvc polymorphism jackson

使用 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/

相关文章:

javascript - 使用 Javascript/JQuery 迭代 JSON 响应

PHP,在json中索引mysql ID。这值得么?

mysql - 如何在没有 URL 的情况下使用 JSON 编码数组?

java - Spring MVC + Jquery Ajax 显示 406 错误?

java - 如何删除java应用程序中的上下文路径

java - 为什么并发修改foreach方法而不是for循环

java - Spring Boot 单元测试中的配置 - 无法加载 ApplicationContext

java - 'Users' 以外的集合中的 User.findOne()

java - Guice 在急切的单例中命名注入(inject)

java - 限制 findAll() 结果