java - 在运行时交换 Jackson 自定义序列化器/反序列化器

标签 java json spring jackson-databind

我有以下系统:

enter image description here

  • 我正在将 MediaType.APPLICATION_JSON_VALUE 从 Spring Controller 发送到我的客户端,反之亦然。
  • 我还有待序列化类的导出/导入功能。 JSON 文件是通过使用 ObjectMapper 并利用 writeValueAsStringreadValue 方法创建的。我正在读取和写入 json 文件。
  • 这两个序列化路径当前都使用相同的序列化器/反序列化器。

我使用 @JsonSerialize@JsonDeserialize 注释来为我的一些对象定义自定义序列化。 我想以不同的方式序列化这些对象以进行导出/导入。

所以我想将序列化器/反序列化器交换为导出/导入任务。像这样的事情:

enter image description here

如果我理解docs正确的是,这两个注释只允许一个 using 类。但我想注册多个序列化器/反序列化器并根据一些条件逻辑使用它们。

最佳答案

您可能希望为服务器和客户端配置两个单独的 ObjectMapper 实例。

服务器模块:

ObjectMapper serverMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(ServerDTO.class, new CustomerFileSerializer());
module.addDeserializer(ServerDTO.class, new CustomerFileDeserializer());
serverMapper.registerModule(module);

ServerDTO serverDto = serverMapper.readValue(jsonInput, ServerDTO.class);
String serialized = serverMapper.writeValueAsString(serverDto);

客户端模块:

ObjectMapper clientMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(ClientDTO.class, new CustomerClientSerializer());
module.addDeserializer(ClientDTO.class, new CustomerClientDeserializer());
clientMapper.registerModule(module);

ClientDTO clientDTO = clientMapper.readValue(jsonInput, ClientDTO.class);
String serialized = clientMapper.writeValueAsString(clientDTO);

关于java - 在运行时交换 Jackson 自定义序列化器/反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69116402/

相关文章:

java - Eclipse异常: java. lang.ClassNotFoundException

java - 几个 DAO 层之间的事务?

java - HTTP 状态 500 - javax.servlet.ServletException : Servlet execution threw an exception

javascript - 部署 java 后端和 Javascript 前端

java - Tomcat 启动失败可能是由于 Linux 网络设置 : java.net.BindException: 无法分配请求的地址

java - 游戏正确结束时出现问题

javascript - 如何解析并输出具有动态值的JSON对象?

json - (Kotlin 中的 Moshi)@Json 与 @field :Json

javascript - Fullcalendar 将个人资料图像添加到弹出窗口

spring - xjc 绑定(bind)编译器配置将 xmlns 元素添加到 package-info 类?