Spring Boot - 自定义 JSON 序列化 [重复]

Posted

技术标签:

【中文标题】Spring Boot - 自定义 JSON 序列化 [重复]【英文标题】:Spring Boot - Custom JSON Serialization [duplicate] 【发布时间】: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 进行序列化 这可能对你有帮助:docs.spring.io/spring-boot/docs/current/reference/html/… @PunterVicky - 默认序列化是通过杰克逊的泽西岛,所以任何通过杰克逊的泽西岛都是适用的并且完全相同。 答案只是指向文档的链接您还没有阅读自己,并且仅链接答案,对链接所代表的内容进行了一些最低限度的解释,因此质量非常低。 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码.没有明确问题陈述的问题对其他读者没有用处。 See: How to create a Minimal, Complete, and Verifiable example. 【参考方案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。但我有多个日期字段,每个字段都有不同的格式。

以上是关于Spring Boot - 自定义 JSON 序列化 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Jackson / Spring Boot 中测试自定义 Json Deserializer

Spring Boot中的JSON技术

Spring Boot 自定义Jackson ObjectMapper

Spring Boot 8:Redis使用

Spring Boot 不为 ZonedDateTime 使用自定义反序列化器

Spring Boot中同一实体的多个自定义序列化程序