【问题标题】:Spring Boot - Custom JSON Serialization [duplicate]Spring Boot - 自定义 JSON 序列化 [重复]
【发布时间】:2017-01-30 07:56:15
【问题描述】:

在使用 Jackson 库时,我通常使用 mixins 来执行自定义序列化和反序列化。我在 Spring Boot 应用程序中的 RestController 具有类似于下面列出的方法。我猜 Spring Boot 使用 Jackson 将 VerifyAccountResponse 序列化为字符串。但是,当它们转换为字符串时,这会将我的日历/日期对象转换为长值。我可以使用自定义序列化程序将它们转换为适当的格式。但是,我必须在序列化后将返回类型更改为对象。有没有办法保留相同的签名并将自定义序列化程序添加到 Spring Boot 执行的默认序列化中。

@RequestMapping(value ="verifyAccount", method = RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<VerifyAccountResponse> verifyAccount(@RequestBody VerifyAccountRequest request) {

    VerifyAccountResponse response = service.verifyAccount(request);

    return new ResponseEntity<VerifyAccountResponse>(response, HttpStatus.OK);
}

编辑:

Updated the below based on the answers , but mixin doesn't seem to take effect -

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();

    builder.mixIn(ConnectStatus.class, com.datacast.service.util.DateFormatSerializerMixin.class);

    return builder;
}

编辑 2:

我创建了一个简单的 Spring Boot 项目来测试它,它工作正常。但是当我在我的大型项目中使用这种方法时,日期转换并没有发生。有什么东西可以覆盖 Jackson2ObjectMapperBuilder 吗?

【问题讨论】:

  • 你能添加一个当前序列化和欲望的例子吗?您始终可以注释您的 bean 以使用自定义序列化,Spring-Boot 将使用它。
  • @jbarrueta 我的类在一个 jar 文件中,我无法在它们上添加注释。我正在使用 Jackson mixins 进行序列化
  • @PunterVicky - 默认序列化是通过杰克逊的泽西岛,所以任何通过杰克逊的泽西岛都是适用的并且完全相同。 答案只是指向文档的链接您还没有阅读自己,并且仅链接答案,对链接所代表的内容进行了一些最低限度的解释,因此质量非常低。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码.没有明确问题陈述的问题对其他读者没有用处。 See: How to create a Minimal, Complete, and Verifiable example.

标签: java spring spring-mvc spring-boot jackson


【解决方案1】:

您可以通过多种方式在 Spring Boot 应用程序中自定义 Jackson 序列化程序。请考虑查看 spring boot 参考指南中关于 jackson 的文档:

https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto.html#howto-customize-the-jackson-objectmapper

您可以使用 Jackson2ObjectMapperBuilder 配置自定义序列化程序。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.html#serializerByType-java.lang.Class-com.fasterxml.jackson.databind.JsonSerializer-

【讨论】:

  • 谢谢@Lakatos。我更新了mixins,但仍然没有生效。我已经更新了我原来帖子中的代码。
  • 我在一个单独的程序中实现了这个,效果很好。但是,当我在我的应用程序中使用它时,它没有返回格式化的日期。我正在从几个使用 EnableMvc 注释的 jar 中扩展类。我怀疑这会导致执行序列化。
【解决方案2】:

您可以通过设置属性自定义日期格式(据我了解这是您发布帖子的主要原因)

spring.jackson.date-format= 
# Date format string or a fully-qualified date format class name.
For instance `yyyy-MM-dd HH:mm:ss`.

【讨论】:

  • 谢谢@dimuha。但我有多个日期字段,每个字段都有不同的格式。
猜你喜欢
  • 2016-12-31
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多