关于@JSONField和@JsonFormat的使用区别说明
作者:小布1994
@JSONField和@JsonFormat的区别
@JSONField是阿里巴巴下fastjson下的,@JsonFormat是jackson下面的。
一、@JSONField的常用方式
1.1、name的用法:
实体类:
package com.xiaobu.entity; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; import javax.persistence.*; import java.io.Serializable; /** * @author xiaobu * @version JDK1.8.0_171 * @date on 2018/12/4 19:00 * @description V1.0 */ @Data public class Roles implements Serializable { private static final long serialVersionUID = 5775171105018867238L; @JSONField(name = "role_id") @Column(name = "RoleId") private Integer RoleId; @JSONField(name = "role_desc") @Column(name = "RoleDesc") private String RoleDesc; }
测试类:
/** * @author xiaobu * @date 2018/12/5 16:53 * @descprition 表明 json不区分大小写都能转换 * @version 1.0 * bean to JSON:{"role_desc":"admin","role_id":8} * 需要转换的json:{"ROLE_DESC":"ADMIN","ROLE_ID":8} * RoleDesc:ADMIN */ @Test public void testJSONField(){ Roles roles = new Roles(); roles.setRoleDesc("admin"); roles.setRoleId(8); String jsonStr=JSONObject.toJSONString(roles); System.out.println("bean to JSON:"+jsonStr); //改变json的key为大写 jsonStr = jsonStr.toUpperCase(); System.out.println("需要转换的json:" + jsonStr); roles = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Roles.class); System.out.println("RoleDesc:"+roles.getRoleDesc()); }
1.2 format的用法:
实体类:
/** * 任务接收时间 */ @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") @JSONField(format = "yyyy-MM-dd") @Column(name="TaskAcceptTime") private Date TaskAcceptTime; /** *任务完成时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @JSONField(format = "yyyy-MM-dd") @Column(name="TaskCompleteTime") private Date TaskCompleteTime;
测试类:
@Test public void findByExample() { Task task = new Task(); task.setTaskId("HYR08274-0804"); Example example = new Example(Task.class); Example.Criteria criteria = example.createCriteria(); if (StringUtils.isNotBlank(task.getTaskId())) { criteria.andLike("TaskId", "%" + task.getTaskId() + "%"); } //TaskAcceptTime=Mon Aug 04 00:00:00 CST 2008,TaskCompleteTime=Fri Nov 07 00:00:00 CST 2008 List<Task> tasks = taskMapper.selectByExample(example); System.out.println(tasks); //""taskAcceptTime":"2008-08-04","taskCompleteTime":"2008-11-07" String fastJsonStr = JSON.toJSONString(tasks); System.out.println("fastJsonStr = " + fastJsonStr); ObjectMapper MAPPER = new ObjectMapper(); try { //""TaskAcceptTime":"2008-08-04","TaskCompleteTime":"2008-11-07 00:00:00" String ujosn = MAPPER.writeValueAsString(tasks); System.out.println("ujosn = " + ujosn); } catch (JsonProcessingException e) { e.printStackTrace(); } }
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") 必须加上时区。
@JSONField(format = "yyyy-MM-dd")
这两个的作用都是格式化日期时间。且只能作用在日期时间上。
补充:前台传后台
@DateTimeFormat(pattern="yyyy-MM-dd")
@JsonFormat与@DateTimeFormat用法及注意事项
@JsonFormat
@JsonFormat ,使用该注解前需要添加 jackson 相关的依赖包
用于服务器传给前端json数据时对Date类型时间进行的格式化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
pattern就表示需要转变的格式,timezone表示处在的时区(国内是东八区)
因为,jackson在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时
如果没有用@JsonFormat 对时间进行格式化,返回给前端的将是一个时间戳。如图所示。
使用了@JsonFormat之后,时间格式正确显示。如图所示。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
注意事项
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
pattern中定义的格式的大小写要注意,不要写错。。。
@DateTimeFormat
@DateTimeFormat是spring的注解,spring工程下不在需要额外引入其他依赖
由于客户端传给服务端的时间参数是字符串类型,如果直接使用java.util.Date下的Date接受的话,会报400的异常(400异常表示服务器不处理该请求,多半是传入的参数问题)
可以使用@DateTimeFormat将客户端发送过来的时间参数转换成想要的类型
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
pattern定义需要转换的格式(跟前面一样。大小写需要严格定义)
这样
服务端就可以正确接收,打印的时间参数为
Mon Apr 01 16:26:25 CST 2019
注意:@JsonFormat与@DateTimeFormat只是定义时间参数在客户端和服务端之间转换格式,控制台、Debug显示的还是java.util.Date下的Date类型形式,如果想要转换的话可以自己使用SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
一些特殊情况
如果使用pattern = "yyyy-MM-dd"接收上述客户端的参数
@DateTimeFormat(pattern = "yyyy-MM-dd")
这样也能正确接收到,但是会将时分秒全部置为00
Mon Apr 01 00:00:00 CST 2019
如果使用pattern = "yyyy-MM-dd HH:mm:ss"接收客户端传来的没有时分秒的参数
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
会报400异常!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。