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

这篇具有很好参考价值的文章主要介绍了一文了解Jackson注解@JsonFormat及失效解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

项目中使用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.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

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

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

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

@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());
    }
}
@Configuration
public 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;


@Override
public 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;

@Override
public 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;

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

gson:GsonHttpMessageConverter;

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

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;
  // ...
}

一文了解Jackson注解@JsonFormat及失效解决文章来源地址https://www.toymoban.com/news/detail-460527.html

翩若惊鸿,婉若游龙。

到了这里,关于一文了解Jackson注解@JsonFormat及失效解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前后端时间传递之注解形式(@DateTimeFormat与@JsonFormat)

    在我们开发的过程中常常会遇到前后端传递时间的问题,同样笔者也是遇到了这样的问题,以前笔者的做法是在代码中转换:前端传String类型的时间,然后后端用String接收以后存入数据库时再转化为Date;返回给前端时也是一样,先从数据库中查出Date类型的数据,返回给前端

    2024年02月05日
    浏览(34)
  • 解决使用@Field注解配置分词器失效问题(Spring Data Elasticsearch)

    问题复现:插入数据时,实体类配置的@Field注解没有生效 实体类: 查看索引库,发现它使用动态映射,并没有使用静态映射: 解决方案:在插入数据时,提前创建索引库和映射。

    2024年02月16日
    浏览(34)
  • jackson相关注解

    @JsonIgnoreProperties         @JsonIgnoreProperties(value = { \\\"prop1\\\",\\\"prop2\\\" })用来修饰Pojo类, 在序列化和反序列化的时候忽略指定的属性, 可以忽略一个或多个属性.         @JsonIgnoreProperties(ignoreUnknown = true)用来修饰Pojo类, 在反序列化的时候忽略那些无法被设置的属性, 包括无法在构

    2024年02月02日
    浏览(50)
  • Jackson 各种注解使用示例

    参考资料 Jackson使い方メモ 在序列化和反序列化 JSON 数据时,忽略指定的属性。 返回数据给前台 ⏹由于给id属性添加了 @JsonIgnore 注解,所以id并没有返回给前台。 同时指定多个需要忽略的属性 ⏹可以看到,因为id和content属性被忽略,所以只有name属性被返回到了前台。 ⏹由

    2024年04月14日
    浏览(36)
  • SpringBoot+MyBatis-Plus多数据源@DS注解失效的解决方法

    引入 dynamic-datasource: application.yml 数据源配置: 详细使用请看 MyBatis-Plus官网 这种场景还是比较常见,比如在一个为master数据源的调用slave数据源就会失效 slave数据源Service方法 mater数据源Service方法调用slave数据源Service方法 这里会出现没有走slave_1,依然还是master数据源 需要在

    2024年01月18日
    浏览(52)
  • Java jackson常用注解汇总

    提起 jackson ,在日常使用中,由于涉及到各种序列化和反序列化的处理,就不能不提 注解 ,了解注解的常用方式可以极大地方便我们处理序列化,今天分享一些在使用 jackson 中涉及到的注解。 目录 1.@JsonProperty - 字段命名 2.@JsonPropertyOrder - 字段序列化顺序 3.@JsonAlias - 字段别

    2024年02月05日
    浏览(47)
  • 【夏令时】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天

    用@JsonFormat(pattern = \\\"yyyy-MM-dd\\\")注解,出生日期竟然年轻了一天 艺术源于生活,bug源于开发。 起因是艰苦奋战一个月, 测试及验收都顺利通过 ,上线也稳稳的 成功 。但是 毒奶 总是在不经意给你灌上,部分的用户的 身份证和出生日期对不上,总是少一天 。 开始以为 前端显

    2024年02月11日
    浏览(40)
  • SpringBoot中通过自定义Jackson注解实现接口返回数据脱敏

    SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文: SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文_霸道流氓气质的博客-CSDN博客 上面讲的是数据库中存储密文,查询时使用明文的脱敏方式,如果是需要数据库中存储 明文

    2024年02月16日
    浏览(43)
  • 【Promise】一文带你了解promise并解决回调地狱

    为什么需要promise 需求 通过ajax请求id,再根据id请求用户名,再根据用户名获取email 回调地狱 在回调函数中嵌套回调 在上述代码中通过不断请求数据,代码逐级向外递归,形成了回调地狱。 使用promise就可以完美解决,并且让我们的代码更加美观。 Promise是一个构造函数,通过n

    2024年02月21日
    浏览(42)
  • 一文了解IntelliJ IDEA如何使用git上传代码到GitHub(附常见问题解决方案)

    本文对应知识库文档(持续更新常见问题解决方案中ing) IntelliJ IDEA使用以及下载 (yuque.com) IDEA使用 git 参考链接 https://www.cnblogs.com/chenchenzi/p/14923708.html 解决访问Github出现的Couldn‘t connect to server错误 解决访问Github出现的Couldn‘t connect to server错误-CSDN博客 解决IDEA中用Git推送时

    2024年02月04日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包