关于@JSONField和@JsonFormat的使用区别说明
@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异常!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。