@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;
@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;
}
测试类:
@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异常!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。