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

news2024/11/24 3:01:06

@JsonFormat、@JSONField、@DateTimeFormat详细解说_@jsonfield format_xinlianluohan的博客-CSDN博客

三者出处

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。

 
  1. import java.util.Date;

  2. public class DateVo {

  3. private Date date;

  4. //省略set\get方法

  5. }

定义一个Controller

 
  1. @RestController

  2. @RequestMapping("/date/")

  3. public class DateController {

  4. @RequestMapping("test")

  5. public DateVo getDate(DateVo vo){

  6. System.out.println("date1:"+vo.getDate());

  7. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  8. String date = sdf.format(vo.getDate());

  9. System.out.println("date2:"+date);

  10. DateVo vo2 = new DateVo();

  11. vo2.setDate(new Date());

  12. return vo2;

  13. }

  14. }

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

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

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

2. 入参格式化

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

改造 DateVo:

 
  1. public class DateVo {

  2. @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")

  3. private Date date;

  4. public void setDate(Date date){

  5. this.date = date;

  6. }

  7. public Date getDate(){

  8. return date;

  9. }

  10. }

再像上面一样访问 /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:

 
  1. public class DateVo {

  2. @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")

  3. @JsonFormat(

  4. pattern = "yyyy-MM-dd HH:mm:ss"

  5. )

  6. private Date date;

  7. public void setDate(Date date){

  8. this.date = date;

  9. }

  10. public Date getDate(){

  11. return date;

  12. }

  13. }

继续访问 /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 注解还要再加一个属性:

 
  1. @JsonFormat(

  2. pattern = "yyyy-MM-dd HH:mm:ss",

  3. timezone = "GMT+8"

  4. )

  5. private Date date;

这样,结果就正确了。

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

参考:@JsonFormat、@JSONField、@DateTimeFormat的使用以及其区别 ||||返回json的时候的时间转化_hanpenghu的博客-CSDN博客

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1024587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS SASS calc() 计算表达式或使用变量

calc()是css的一个函数,可用于元素计算长度,比如div宽度想要减去一个固定宽度后并自适应,可以写为calc(100% - 60px) 注意“-”两边有空格 sass已经是常用的预编译语言,允许使用变量等规则,如果…

上海亚商投顾:沪指窄幅震荡微跌 两市成交金额创年内新低

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡,创业板指盘中跌超1%,黄白二线有所分化。华为星闪概念股午后拉升&…

EPC与5GC/5GS互联互通

一、5GS与EPC/E-UTRAN互通的非漫游架构 1.N26接口是MME和5GS AMF之间的CN间接口,以实现EPC和NG核心之间的互通。网络中支持N26接口是可选的,用于互通。N26支持在S10上支持的功能的子集(对于互通是必要的)。 2&#xf…

面试题:HTTPS 是如何保证传输安全的?又被问了!

文章目录 1. HTTP 协议1.1 HTTP 协议介绍1.2 HTTP 中间人攻击1.3 防止中间人攻击 2. HTTPS 协议2.1 HTTPS 简介2.2 CA 认证体系 总结 1. HTTP 协议 在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议&…

Android13 大屏设备底部显示TaskBar并NavagatonBar居右

Android 13大屏设备时底下显示任务栏以及虚拟按键靠右的问题, 当前需求是去掉底部任务栏的显示,并把虚拟按键导航栏居中显示。 修改前的效果: 修改后的效果: 通过查看源码逻辑,可以发现只需把isTablet相关的逻辑和…

Mybatis 映射器中映射方法接受多个参数(@Param)

前面我们介绍了使用Mybatis映射器进行数据的增删改查操作;本篇我们继续介绍在Mybatis映射器的映射方法中如何使用多个参数。 如果您对Mybatis使用映射器进行数据的增删改查操作不太了解,建议您先进行了解后再阅读本篇,可以参考: …

【数据结构】二叉树的构建与基本操作实现

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.前序建立二叉树 2.销毁二叉树 3.统计 …

uni-app 之 picker选择器

uni-app 之 picker选择器 同步滚动&#xff1a;开 uni-app 之 picker选择器 一、普通选择器 二、多列选择器 三、时间选择器 四、日期选择器 一、普通选择器 <template><view><picker change"bindPickerChange" :value"index" :range&q…

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理 在过去十年中&#xff0c;航天器一直是现代技术进步的先决条件。迄今为止&#xff0c;为了更好地完成各种实际任务&#xff0c;已经在航天器姿态控制领域进行了大量研究。航天器一旦进入太空&#xff0c;就容易出现不确定…

JavaWeb开发-05-SpringBootWeb请求响应

一.请求 1.Postman 2.简单参数 ​ package com.wjh.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/** 测试请求参数接受*/ R…

【IntelliJ IDEA】cmd和idea Terminal查看java版本不一致

问题描述 原来win10电脑上安装的是jdk8的版本&#xff0c;因某些原因&#xff0c;现在想换成jdk7的版本&#xff0c;修改环境变量后&#xff0c;在cmd中执行 [java -version]命令&#xff0c;显示的是7的版本。 但在idea的Terminal中执行&#xff0c;确实显示8的版本。 原因分…

vue设置路由模式为history,打包部署,并解决404问题

现在Router配置里面加上 base 和 mode 属性&#xff1a; export default new Router({base: /your_project_name/,mode: history,routes: [......] })这样就能支持 history 模式了&#xff0c;但是现在静态资源获取还有问题。 解决静态资源获取问题 在 config/index.js 文件…

TS中的数据类型

一、number类型 let c: number; c 10; c "hello"; // 不能复制string类型 二、string类型 let d: string; d "hello"; d 10; // 不能复制number类型 三、boolean类型 let e: boolean true; e false; e 10; // 不能赋值true和false以外的值 四…

Cypress安装与使用教程(1)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

半导体划片机工艺应用

半导体划片工艺是半导体制造过程中的重要步骤之一&#xff0c;主要用于将大尺寸的晶圆切割成小片&#xff0c;以便进行后续的制造和封装过程。以下是一些半导体划片工艺的应用&#xff1a; 晶圆划片&#xff1a;在半导体制造过程中&#xff0c;需要将大尺寸的晶圆切割成小片&am…

【数据库系统概论】数据库系统外部的体系结构

单用户结构主从式结构分布式结构客户机&#xff0f;服务器结构&#xff08;C/S结构&#xff09;浏览器 / 服务器结构&#xff08;B/S结构&#xff09;感谢 &#x1f496; 上一篇文章 数据库系统的三级模式和二级映射介绍的是数据库系统内部的体系结构&#xff0c;是从应用开发…

计算机网络知识补充(1)

计算机网络:是一个将分散的&#xff0c;具有独立功能的计算机系统&#xff0c;通过通信设备和线路进行连接起来&#xff0c;由功能完善的软件实现资源共享和信息共享的系统&#xff0c;计算机网络是互连的&#xff0c;自治的计算机集合 互连:通过通信链路来进行互联互通 自治:没…

云安全威胁和责任

云计算的共享特性和按需定制本质除了给企业带来效率上提升&#xff0c;也引入了新的安全威胁&#xff0c;有可能使企业得不偿失。 之前云安全联盟(CSA)的报告便指出&#xff0c;云服务天生就能使用户绕过公司范围内的安全策略&#xff0c;建立起自己的影子IT项目服务账户。 新的…

全面感知,智能预警!燃气感知云,守护城市“烟火气”

燃气安全如何保障&#xff1f;燃气企业如何精准运营&#xff1f;天翼物联基于感知云平台创新能力&#xff0c;提供燃气感知云服务&#xff0c;包括泛协议接入、感知云燃气平台、燃气感知数据治理、决策处置大屏四大服务&#xff0c;构建燃气行业感知神经系统新型数字化底座&…

Interceptor的使用场景:拦截请求中的租户信息,注入到租户上下文中

业务场景 在SaaS环境中&#xff0c;租户是最重要的隔离业务数据的属性了&#xff0c;在自己的项目体系环境中&#xff0c;租户id能保证有值。但有个特殊场景&#xff0c;某些特殊权限的账号需要修改指定租户的内容&#xff0c;也即前端会携带租户信息过来&#xff0c;并且内部涉…