返回顶部
首页 > 资讯 > 后端开发 > JAVA >一文了解Jackson注解@JsonFormat及失效解决
  • 958
分享到

一文了解Jackson注解@JsonFormat及失效解决

javaspringjsonspringboot 2023-09-02 10:09:15 958人浏览 八月长安
摘要

背景 项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下: spring: jackson: time-zone: Asia/Shangh

背景

项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下:

spring:  jackson:    time-zone: Asia/Shanghai    serialization:      WRITE_DATES_AS_TIMESTAMPS: true

尝试是否关于时间的注解是否会生效,使用@JSONFORMa@jsonFiled均失效。

常见失效原因及解决方法

@JsonFormat是用于指定Java对象序列化为JSON字符串时的格式化方式的注解。如果@JsonFormat失效,可能是以下原因:

  1. 未正确导入Jackson库
  2. 注解位置不正确
  3. 注解参数设置错误

解决方法:

  1. 确认是否正确导入了Jackson库,可以在pom.xml文件中添加以下依赖:
<dependency>    <groupId>com.fasterxml.jackson.coregroupId>    <artifactId>jackson-databindartifactId>    <version>2.12.3version>dependency>

确认注解位置是否正确,例如:

public class User {    @JsonFormat(pattern = "yyyy-MM-dd")    private Date birthday;    // ...}

确认注解参数是否正确设置,例如:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")public Date getCreatedDate() {    return createdDate;}

以上是常见的解决方法,如果还有问题可以提供更具体的错误信息进行排查。

本次问题解决

失效原因

因为项目中使用了Gson替换Jackson。
代码如下:

import com.Google.gson.JsonElement;import com.google.gson.JsonParser;import com.google.gson.JsonSerializationContext;import com.google.gson.JsonSerializer;import springfox.documentation.spring.WEB.json.Json;import java.lang.reflect.Type;public class JsonToGson implements JsonSerializer<Json> {    @Override    public JsonElement serialize(Json json, Type type, JsonSerializationContext context) {        return JsonParser.parseString(json.value());    }}
@Configurationpublic class swaggerWebConfiguration implements WebmvcConfigurer {    @Override    public void addResourceHandlers(ResourceHandlerReGIStry registry) {        registry.addResourceHandler("/swagger-ui/**")                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");    }    @Override    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {        converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof MappingJackson2HttpMessageConverter);        converters.add(gsonHttpMessageConverters());    }    @Bean    public GsonHttpMessageConverter gsonHttpMessageConverters() {        Gson gson = new GsonBuilder()                .registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter())                .create();        GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter(gson);        return gsonConverter;    }}

解决方案一:去掉Gson转换即可。

解决方案二:重新添加MappingJackson2HttpMessageConverter的bean

@Autowired(required = false)private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {    converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);    if (Objects.isNull(mappingJackson2HttpMessageConverter)) {        converters.add(0, new MappingJackson2HttpMessageConverter());    } else {        converters.add(0, mappingJackson2HttpMessageConverter);    }}

@Autowired(required = false)private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {    converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);    if (Objects.isNull(mappingJackson2HttpMessageConverter)) {        converters.add(0, new MappingJackson2HttpMessageConverter());    } else {        converters.add(0, mappingJackson2HttpMessageConverter);    }}

解析

Jackson一直是springframework默认的json库,从4.1开始,springframework支持通过配置GsonHttpMessageConverter的方式使用Gson。

Spring MVC中,一旦请求退出@Controller,它将寻找一个视图来呈现。当指定了@RequestBody@RestController时,我们会告诉Spring跳过这一步,将java对象通过model写入响应结果。Spring通过HttpMessageConverter来执行Java对象向其它类型(通常是Json)的转换,Spring默认使用的是 MappingJackson2HttpMessageConverter,所以如果希望使用Gson来执行这种转换,可用使用GsonHttpMessageConverter替换Jackson

小拓展

Spring Boot提供了与三个JSON映射库的集成:Gson、默认库 Jackson 、JSON-B

@JsonFormat与@JSONField简介

@JsonFormat

@JsonFormat是Java中的一个Jackson注解,用于指定某个字段或属性,或整个类的JSON序列化或反序列化格式。它允许在将数据类型转换为或从JSON格式转换时自定义日期、数字、布尔值等数据类型的格式。

例如,如果您有一个Java类,其中包含一个Date字段,您希望以特定格式将其序列化为JSON,您可以使用@JsonFormat注解来指定该格式:

示例如下:Jackson在序列化或反序列化myDate字段时使用“yyyy-MM-dd”格式。

public class MyClass {  @JsonFormat(pattern="yyyy-MM-dd")  private Date myDate;  // ...}

@JSONField

@JSONField是阿里巴巴的fastjson库中的一个注解,用于指定Java对象属性在序列化为JSON字符串时的名称、顺序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java对象属性在序列化为JSON字符串时使用"username"作为属性名。

区别

@JsonFormat和@JSONField都是用于控制Java对象属性在序列化为JSON字符串时的格式,但是它们有一些不同之处。

@JsonFormat是Jackson库中的一个注解,用于指定Java对象属性在序列化为JSON字符串时的日期、时间、数字等格式。例如,可以使用@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”)指定Java对象属性在序列化为JSON字符串时使用指定的日期时间格式。

@JSONField是阿里巴巴的fastjson库中的一个注解,用于指定Java对象属性在序列化为JSON字符串时的名称、顺序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java对象属性在序列化为JSON字符串时使用"username"作为属性名。

因此,虽然@JsonFormat和@JSONField都可以用于控制Java对象属性在序列化为JSON字符串时的格式,但是它们的作用范围和使用方式略有不同。

jackson自定义日期注解

依赖HttpMessageConverter默认实现如下:

jackson:MappingJackson2HttpMessageConverter;

请添加图片描述

gson:GsonHttpMessageConverter;

请添加图片描述

fastjson : FastJsonHttpMessageConverter

1、自定义转换类:

public class DateToJsonSerializer extends JsonSerializer<Date> implements ContextualSerializer {    private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    public DateToJsonSerializer() {    }    @Override    public void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {        if (null != arg0) {            arg1.writeString(this.df.format(arg0));        }    }    @Override    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)   {        AnnotationMap annotated = property.getMember().getAllAnnotations();        JsonFormat jsonFormat = annotated.get(JsonFormat.class);        if (jsonFormat != null && jsonFormat.pattern() != null){            df = new SimpleDateFormat(jsonFormat.pattern());        }        return this;    }}

2、使用

public class MyClass {  @JsonSerialize(using = DateToJsonSerializer .class)  private Date myDate;  // ...}

在这里插入图片描述

翩若惊鸿,婉若游龙。

来源地址:https://blog.csdn.net/qq_35764295/article/details/129718739

--结束END--

本文标题: 一文了解Jackson注解@JsonFormat及失效解决

本文链接: https://lsjlt.com/news/390609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文了解Jackson注解@JsonFormat及失效解决
    背景 项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下: spring: jackson: time-zone: Asia/Shangh...
    99+
    2023-09-02
    java spring json spring boot
  • Jackson反序列化@JsonFormat 不生效的解决方案
    今天在线上发现一个问题,在使用Jackson进行时间的反序列化时,配置的 @JsonFormat 没有生效 查看源码发现,Jackson在反序列化时间时,会判断json字段值类型,如...
    99+
    2024-04-02
  • springboot2中使用@JsonFormat注解不生效的解决
    目录使用@JsonFormat注解不生效本次使用的版本号解决方式@JsonFormat和@DateTimeFormat的作用使用@JsonFormat注解不生效 百度了不少解决方式,...
    99+
    2024-04-02
  • 一次排查@CacheEvict注解失效的经历及解决
    目录排查@CacheEvict注解失效下面是我通过源码跟踪排查问题的过程小结一下说说spring全家桶中@CacheEvict无效情况举个例子排查@CacheEvict注解失效 我简...
    99+
    2024-04-02
  • 使用@JsonFormat的一个坑及解决
    目录使用@JsonFormat的一个坑及解决解决如下JsonFormat的时间格式踩坑使用@JsonFormat的一个坑及解决 spring boot项目 ,mysql数据库的dat...
    99+
    2024-04-02
  • springboot2中使用@JsonFormat注解不生效怎么解决
    这篇“springboot2中使用@JsonFormat注解不生效怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“sp...
    99+
    2023-06-29
  • spring boot项目使用@JsonFormat失效问题的解决
    目录使用@JsonFormat失效原因:项目中配置了fastjson包使用@JsonFormat注解踩过的坑错误原因解决方案使用@JsonFormat失效 在实体类定义时间格式 原...
    99+
    2024-04-02
  • 如何解决spring boot项目使用@JsonFormat失效问题
    这篇文章给大家分享的是有关如何解决spring boot项目使用@JsonFormat失效问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用@JsonFormat失效在实体类定义时间格式原因:项目中配置了fa...
    99+
    2023-06-25
  • 事务注解@Transactional失效的场景及解决办法
    本篇内容主要讲解“事务注解@Transactional失效的场景及解决办法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“事务注解@Transactional失效的场景及解决办法”吧!Transa...
    99+
    2023-06-15
  • @Transaction,@Async在同一个类中注解失效的原因分析及解决
    目录@Transaction @Async在同一个类中注解失效下面用伪代码阐述一下原因说说解决@Async的实现类方式方法1:实现接口AsyncConfigurer方法2:直接注入b...
    99+
    2024-04-02
  • @Autowired注解在抽象类中失效的原因及解决
    @Autowired注解在抽象类中失效 最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是出现空指针异常,通过日志的打印,发现是这...
    99+
    2024-04-02
  • @CacheEvict注解失效的经历及解决方法是什么
    @CacheEvict注解失效的经历及解决方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。排查@CacheEvict注解失效我简单看了一下《Spring...
    99+
    2023-06-22
  • javax NotBlank和Email注解失效的解决
    javax NotBlank和Email注解失效 使用javax的NotBlan和Email注解, 结果报类似错误 no validator could be found for ...
    99+
    2024-04-02
  • swagger注解@ApiModelProperty失效情况的解决
    目录swagger注解@ApiModelProperty失效swagger 版本 2.29.2解决方式: 小写字段名@ApiModelProperty注解的使用下面是它内部的常用属性...
    99+
    2024-04-02
  • spring注解事务失效如何解决
    在Spring中,如果注解式事务失效,可能有以下几个原因:1. 没有配置事务管理器:在Spring中,必须配置一个事务管理器来管理事...
    99+
    2023-09-28
    spring
  • spring事务注解失效怎么解决
    如果在使用Spring事务注解时遇到失效的情况,可以尝试以下解决方法:1. 确保在Spring配置文件中配置了事务管理器(如Data...
    99+
    2023-09-13
    spring
  • 如何解决hibernate一对多注解懒加载失效问题
    目录hibernate一对多注解懒加载失效经排查,问题出在controller这边解决方法Hibernate懒加载异常说明及其解决懒加载异常出现的原因解决方案1解决方案2解决方案3h...
    99+
    2024-04-02
  • Jackson序列化丢失泛型的解决
    Jackson序列化丢失泛型 经过 项目中遇到一个奇怪的bug,即一个Map<Integer,List<Integer>>的泛型map,向map中get一个存...
    99+
    2024-04-02
  • vue中@keyup.enter失效问题及解决
    目录@keyup.enter失效问题情况一(我遇到的情况)情况二(百度时了解到的)@keyup.enter和@blur触发两次和回车无效1.vue 对 input 绑定两个事件:回车...
    99+
    2022-11-13
    vue中@keyup.enter @keyup.enter失效 vue中@keyup.enter失效
  • @Autowired注解及失效的原因有哪些
    这篇文章主要讲解了“@Autowired注解及失效的原因有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“@Autowired注解及失效的原因有哪些”吧!1、Autowired注解作用使构...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作