@JsonFormat、@JSONField、@DateTimeFormat详细解说

article/2025/9/23 18:29:34

三者出处

1、JsonFormat来源于jackson,Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。 
2、JSONField来源于fastjson,是阿里巴巴的开源框架,主要进行JSON解析和序列化。 
3、DateTimeFormat是spring自带的处理框架,主要用于将时间格式化。

用法

DateTimeFormat

因为其用法比较单一,只用于将字符串格式化成日期,在加入spring以后,直接使用注解@DateTimeFormat(pattern=”yyyy-MM-dd”)即可。@DateTimeFormat 注解有3个可选的属性:style,pattern和iso。

属性style: 允许我们使用两个字符的字符串来表明怎样格式化日期和时间。第一个字符表明了 日期的格式,第二个字符表明了时间的格式。下面的表格中列出了可用的选择以及相应的输出的例子: 
描述 字符串值 示例输出

Tables    Are    Cool
短格式(这是缺省值)    SS    8/30/64 11:24 AM
中等格式    MM    Aug 30, 1964 11:24:41 AM
长格式    LL    August 30, 1964 11:24:41 AM CDT
完整格式    FF    Sunday, August 30,1964 11:24:41 AM CDT
使用短横线省略日期或时间    M-    Aug 30, 1964
Pattern: 属性允许我们使用自定义的日期/时间格式。该属性的值遵循java标准的date/time格式规范。缺省的该属性的值为空,也就是不进行特殊的格式化。通常情况下我们都是使用这个 注解做自定义格式化的。 
iso: 基本上用不上,这里不做讲解

JsonFormat

用法 为在属性值上 @JsonFormat(pattern=”yyyy-MM-dd”,timezone=”GMT+8”),如果直接使用 @JsonFormat(pattern=”yyyy-MM-dd”)就会出现2018-08-01 08:00:00的情况, 会相差8个小时,因为我们是东八区(北京时间)。所以我们在格式化的时候要指定时区(timezone )

JSONField

用法:目前最常用的属性是@JSONField(name=”resType”)和 @JSONField(format=”yyyy-MM-dd”) 
name:@JSONField(name=”resType”)主要用于指定前端传到后台时对应的key值,如果bean中没有这个注解,则默认前端传过来的key是field本身,即如果是private String name,name前端对应的key就是name才能对应上。 
format @JSONField(format=”yyyy-MM-dd”)主要用于格式化日期,比如前台传过来的时间是2018-07-12 17:44:08,但是通过这个注解,你存到数据库的时间就是2018-07-12 00:00:00.

区别

网上有说DateTimeFormat主要用于后台接受前台的值,而JsonFormat主要用于后台传值到前台,其实都一个用,没差的。其他的区别就是速度的问题了,这里有一篇其对数据的处理速度的对比,供大家参考。 
https://github.com/eishay/jvm-serializers/wiki

实战讲解:

1. 准备

定义一个pojo,它有一个 java.util.Date 类型的属性 date。

import java.util.Date;public class DateVo {private Date date;//省略set\get方法}

定义一个Controller

@RestController
@RequestMapping("/date/")
public class DateController {@RequestMapping("test")public DateVo getDate(DateVo vo){System.out.println("date1:"+vo.getDate());SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date = sdf.format(vo.getDate());System.out.println("date2:"+date);DateVo vo2 = new DateVo();vo2.setDate(new Date());return vo2;}
}

访问 /date/test ,并传入参数:2018-08-02 22:05:55

发现并不能访问成功,会抛出异常:

因为传入的参数是 String 类型的,而用来接收参数的 DateVo 的 date 属性是 java.util.Date 类型的,类型无法转换。

2. 入参格式化

这时,就可以使用 Spring 的 @DateTimeFormat 注解格式化参数,来解决上述问题。

改造 DateVo:

public class DateVo {@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")private Date date;public void setDate(Date date){this.date = date;}public Date getDate(){return date;}
}

再像上面一样访问 /date/test ,并传入参数:2018-08-02 22:05:55,将在控制台上打印:

date1:Thu Aug 02 22:05:55 CST 2018

date2:2018-08-02 22:05:55

可以看到,加入 @DateTimeFormat 注解后参数可以被接收到了,但日期时间的格式还是需要自己再手动转换一下。

因为 @DateTimeFormat 注解的 pattern 属性值指定的日期时间格式并不是将要转换成的日期格式,这个指定的格式是和传入的参数对应的,假如注解为:

@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss")

则传入的参数应该是这样的:

2018/08/02 22:05:55

否则会抛出异常。

3. 出参格式化

在上述示例中,调用接口的返回结果为:

"date": "2018-08-01T14:25:31.296+0000"

这个格式并不是我们想要的,那么如何将其进行格式化?这时就需要用到 jackson 的 @JsonFormat 注解。

改造 DateVo:

public class DateVo {@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date date;public void setDate(Date date){this.date = date;}public Date getDate(){return date;}
}

继续访问 /date/test ,并传入参数:2018-08-02 22:05:55,可以看到接口返回的结果为:

"date": "2018-08-01 14:32:57"

虽然时间格式正确了,但实际上当前时间是 “2018-08-01 22:32:57” ,早了8个小时。因为,jackson在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时。

所以,@JsonFormat 注解还要再加一个属性:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8"
)
private Date date;

这样,结果就正确了。

因为 @JsonFormat 注解不是 Spring 自带的注解,所以使用该注解前需要添加 jackson 相关的依赖包。当然,如果是 SpringBoot 项目就不需要自己手动添加依赖了,因为在 spring-boot-start-web 下已经包含了 jackson 相关依赖。

 

参考:https://blog.csdn.net/hanpenghu/article/details/84566353

https://blog.csdn.net/zhou520yue520/article/details/81348926


http://chatgpt.dhexx.cn/article/VGKAUxrV.shtml

相关文章

Django JSONField类型操作解析

Django JSONField类型操作解析 模型代码设计正向查询与反向查询解析Json字段操作解析新增查询Json条件查询字段条件查询跨关系查询 修改删除 接口测试平台核心以Httprunner为接口用例运行框架,要将用例的数据持久化到数据库中,方便读取修改与存储&#x…

【java】属性别名:@JsonProperty和@JSONField的区别?【图文教程】

平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信公众号【 IT特靠谱 】,每一篇文章都是心得总结…

fastjson @JSONField format 不生效的原因

&#xff08;以下问题已在fastjson高版本优化<目前我用的是1.2.83版本>&#xff09; 在一次接手项目中发现&#xff0c;http接口返回json数据&#xff0c;Date类型的变量用JSONField format注解格式化不起作用。排查原因&#xff1a; 1&#xff09;查http接口序列化是不…

formdata和json

HTTP content-type Content-Type&#xff08;内容类型&#xff09;&#xff0c;一般是指网页中存在的 Content-Type&#xff0c;用于定义网络文件的类型和网页的编码&#xff0c;决定浏览器将以什么形式、什么编码读取这个文件&#xff0c;这就是经常看到一些 PHP 网页点击的结…

常用注解@JsonField、@JsonFormat、@DateTimeFormat区别

JsonFormat 该注解来源于jackson包中的注解&#xff0c;主要用来控制后端返回给前端的日期格式&#xff0c;通常用在返回给前端的实体类中。 案例如下&#xff1a; class User{private Integer id;JsonFormat(pattern”yyyy-MM-dd”,timezone”GMT8”)private Date birthday;…

Springboot中使用@JsonProperty和@JSONField

2个注解都是为了解决json字符串的某些属性名和JavaBean中的属性名匹配不上的问题。 例子&#xff0c;不使用注解的情况 Data public class Routine {private Integer TTS_voice;} PostMapping("/test8")public Routine test8(RequestBody Routine routine){retur…

@JSONField

1.引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency> 2.JSONField注解可以用在方法&#xff08;method&#xff09;&#xff0c;属性&#xff0…

@JsonField 不起作用

在Springboot中默认的JSON解析框架是jackson&#xff0c;引入alibaba的fastjson&#xff0c;使用JSONField 去接收带有native的json请求&#xff0c;实体类名需要做一个转换&#xff0c;但是接受json串的时候&#xff0c;用到JsonField不起作用&#xff0c;接受过来还是null。 …

一眼看清@JSONField注解使用与效果

JSONField是做什么用的 JSONField是fastjson的一个注解&#xff0c;在fastjson解析一个类为Json对象时&#xff0c;作用到类的每一个属性&#xff08;field&#xff09;上。 通过用JSONField注解一个类的属性&#xff0c;我们可以达到以下目标 指定field对应的key名称&#…

perclos

WierwiIIe驾驶模拟器上的实验结果证明&#xff0c;眼睛的闭合时间一定程度地反映疲劳&#xff0c; 如图 所示。 在此基础上&#xff0c; 卡内基梅隆研究所经过反复实验和论证&#xff0c;提出了度量疲劳/瞌睡的物理量 PERCLOS &#xff08;Percentage of EyeIid CIosure over t…

机器视觉毕业设计 深度学习驾驶人脸疲劳检测系统 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的…

Android studio开发 课设必备疲劳检测app

使用android内置摄像头&#xff0c;可以根据人的状态判定是否疲劳&#xff0c;界面设计较好&#xff0c;检测后还可以回到主界面 运行截图如下&#xff0c;获取源码有偿&#xff0c;拒绝白嫖党~

基于MATLAB的人眼开度疲劳检测识别

一、课题背景 目前&#xff0c;随着人们生活水平的提高&#xff0c;各国人民汽车保有量也越来越多&#xff0c;伴随而来的是交通事故也在不断增多。研究表明&#xff0c;疲劳驾驶是造成交通事故日益严重的重要原因。开展驾驶员疲劳检测和预警的研究工作&#xff0c;有着十分重…

Dlib+Opencv库实现疲劳检测

文章目录 1.关键点检测2.算法实现的核心点3.算法实现&#xff08;1&#xff09;人脸的关键点集合&#xff08;2&#xff09;加载人脸检测库和人脸关键点检测库&#xff08;3&#xff09;绘制人脸检测的框&#xff08;4&#xff09;对检测之后的人脸关键点坐标进行转换&#xff…

Python基于OpenCV的工作疲劳检测系统[源码&UI界面&部署教程]

1.图片演示 2.视频演示 [项目分享]Python基于OpenCV的实时疲劳检测[源码&#xff06;演示视频&#xff06;部署教程]_哔哩哔哩_bilibili 3.检测方法 1&#xff09;方法 与用于计算眨眼的传统图像处理方法不同&#xff0c;该方法通常涉及以下几种组合&#xff1a; 1、眼睛定…

Opencv之疲劳检测

项目要求 在一段视频中&#xff0c;通过检测人眨眼的次数来判断他的疲劳程度。 代码实现 1、导入工具包 from scipy.spatial import distance as dist import numpy as np import dlib import cv22、对脸上的部位进行定义 在关键点定位的官方文档中&#xff0c;提取68个关…

人脸识别-驾驶疲劳检测(1) 眨眼检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、背景 &#xff08;1&#xff09;环境搭建 &#xff08;2&#xff09;下载开源数据集 &#xff08;3&#xff09;视觉疲劳检测原理 二、代码示例 三、效…

人脸检测高级:疲劳检测

今天我们实现疲劳检测。 如果眼睛已经闭上了一段时间&#xff0c;我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意。我们测试一段视频来展示效果。同时代码中保留开启摄像头的的代码&#xff0c;取消注释即可使用。 使用 OpenCV 构建犯困检测器 要开始我们的实…

数字图像处理课程设计-疲劳检测系统

文章目录 数字图像处理课程设计-疲劳检测系统前言一、课程设计任务二、设计框图三、准备工作四、任务流程&#xff14;.&#xff11;视频预处理4.2图片分割 五、结果六、项目总结 数字图像处理课程设计-疲劳检测系统 前言 此系统基于MATLAB设计,核心思想是PERCLOS算法. 参考文…

MATLAB的疲劳检测系统

一、课题介绍 本设计针对现有逐帧眼睛定位方法计算量大&#xff0c;速度慢的缺点&#xff0c;提出一种用于疲劳驾驶实时监测的眼睛定位方法&#xff0c;该方法能够在保证眼睛定位准确性的同时&#xff0c;减少人脸定位的计算量&#xff0c;从而提高图像处理速度&#xff0c;实现…