背景

@JsonFormat用在接口的返回对象属性上时,能够对Date进行格式化处理

@Data
public class UserVo {//注意带时分秒的要指定时区@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date date1;@JsonFormat(pattern = "yyyy-MM-dd")private Date date2;
}
{"date1": "2018-11-30 16:21:57","date2": "2018-11-30"
}

但笔者项目中这样注解不生效,经过代码分析原来是有继承JsonSerializer接口,自定义了Date的转换,那么JsonFormat就失效了,因为自定义的会覆盖JsonFormat的格式化,这是一种通用的处理方式

public class JavaDateJsonSerializer extends JsonSerializer<Date>{private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");public JavaDateJsonSerializer() {}public void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException {if (null != arg0) {arg1.writeString(this.df.format(arg0));}}
}

这样的话,所有的Date在json序列化时都会格式化为yyyy-MM-dd,是一种简单的全局处理方式,但如果一个返回对象的两个Date想返回不同的格式如何处理呢。

ContextualSerializer

将自定义的JavaDateJsonSerializer实现一下ContextualSerializer接口的createContextual方法,然后稍作文章即可

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

createContextual的调用是先于serialize的,createContextual传入了BeanProperty,通过它能获取了到属性的注解,即JsonFormat进而也能获取到JsonFormat中的pattern,接着就可以创建SimpleDateFormat了。这样不实用JsonFormat注解就用默认的格式化,使用JsonFormat注解就根据pattern格式化。

Jackson的@JsonFormat不生效问题相关推荐

  1. jackson全局配置没有生效

    jackson全局配置没有生效 描述 复现 问题定位 解决 验证 结论 参考 描述 springboot项目中,在application.properties中配置了spring.jackson.da ...

  2. jackson 中JsonFormat date类型字段的使用

    为了便于date类型字段的序列化和反序列化,需要在数据结构的date类型的字段上用JsonFormat注解进行注解 具体格式如下 @JsonFormat(pattern = "yyyy-MM ...

  3. jackson 的注解:@JsonProperty、@JsonIgnore、@JsonFormat 用法说明

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 导包: <dependency><groupId>com.faster ...

  4. 深度对比Jackson和Fastjson,最终我还是选择了...

    点击关注公众号,Java干货及时送达 来源:cnblogs.com/larva-zhh/p/11544317.html 为什么要替换fastjson 框架选型 替换fastjson Deseriali ...

  5. datetimeformat和jsonformat的区别

    datetimeformat:用于格式化参数,可将date的字符串转化为date对象,即前端向后端发送一个约定好的时间字符串 "yyyy-MM-dd hh:mm:ss" 既然是格式 ...

  6. 常用json框架介绍和Jackson返回结果处理

    常用json框架介绍和Jackson返回结果处理     简介:介绍常用json框架和注解的使用,自定义返回json结构和格式 1.常用框架 阿里 fastjson,谷歌gson等         J ...

  7. Jackson学习笔记

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...

  8. @JsonFormat Date类型时间 格式化 注解 使用

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. @JsonFormat注解是一个时间格式化注解,比如我们存储在mysql中的数据是date类型的,当 ...

  9. jackson 读取多文件_Spring Boot系列之读取配置

    使用SpringBoot框架开发,读取配置是少不了的,那么你会读取配置吗?你会写配置吗?List?Map? 1 目的 本节我们要解决如下几个问题: 如何使用Spring Boot读取配置文件?有哪些方 ...

最新文章

  1. LAMP编译安装之———httpd
  2. 漫谈时序设计(1)跨时钟域是设计出来的,而非约束出来的!
  3. Kali Linux安装Google中文输入法(只需5步)
  4. 跳石头 NOIP2015 提高组 Day2 T1
  5. mysql 5.1.62_MySQL 5.5.62 安装方法(标准配置版)
  6. mysql error log清理_手动删除mysql日志/var/log/mysql/error.log导致的mysql无法启动
  7. 上传附件_留学落户|上传附件预审时一定一定要注意的问题!
  8. bjca客户端 win10_BJCA证书助手 V2.14.4 官方版
  9. pagehelper自定义 count sql_Spring Boot 2.x(十三):你不知道的PageHelper
  10. gateway配置mysql_使用Gateway配置路由以及动态路由
  11. android中常用正则表达式
  12. chrome charset使用_SourceMap-使用教程
  13. c语言 可以得什么软件下载,用C语言的软件哪可以下载啊?
  14. 计算机网络——数据从网卡到应用的过程
  15. ICTCLAS 汉语词性标注
  16. HTML中的锚点连接
  17. java程序封装最小单位,持续更新中
  18. Ubuntu系统的有线网卡驱动问题
  19. HDU 6595 Everything Is Generated In Equal Probability(概率+组合数)
  20. Ubuntu 下安装 苹果主题界面Mac Sierra Theme

热门文章

  1. HTML5基础扩展——地理位置、本地存储、缓存
  2. MySQL 存储引擎(InnoDB、MyISAM、MEMORY)
  3. 【行人重识别论文阅读笔记——VPM】
  4. 《腾讯数字生活报告》: 泛娱乐和圈层社交成大趋势
  5. SpringBoot整合XXLJob+Docker部署
  6. 2022年全球市场天然除臭剂和香水总体规模、主要生产商、主要地区、产品和应用细分研究报告
  7. VIT与VIG(自用)
  8. tp用phpqrcode制作二维码,可在浏览器下载二维码
  9. 《复仇者联盟》刷票房纪录,灭霸走红,而不甘冷落的AI能为电影界做点什么?...
  10. Python数据分析与数据化运营(笔记)第一章:python与数据化运营