在日常开发中,日期是很常见的一种数据类型,特别是在与数据库打交道的场景。
为了提升日期的可读性,通常会将日期进行格式化之后再输出,用于前端展示和日志打印等场景。
Fastjson在对日期进行处理时,支持按指定的格式进行序列化,也默认支持反序列化一些常用的日期格式。
本篇内容基于Fastjson 1.2.62版本,马上开始学习吧。
序列化日期
默认序列化格式
默认情况下,调用JSON.toJSONString进行序列化,日期会被转化为数字类型的时间戳。
/**
* 默认序列化为数字类型的时间戳
*/
@Test
public void defaultFormat() {
Date date = new Date();
System.out.println(JSON.toJSONString(date));
}
执行结果:
1602150108655
序列化时指定日期格式
如果需要指定日期格式,可以使用JSON.toJSONStringWithDateFormat方法来代替JSON.toJSONString。
/**
* 序列化时指定日期格式
*/
@Test
public void toJSONStringWithDateFormat() {
Date date = new Date();
System.out.println(JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss"));
Map<String, Date> map = new HashMap<>();
map.put("now", date);
System.out.println(JSON.toJSONStringWithDateFormat(map, "yyyy-MM-dd HH:mm:ss"));
}
执行结果:
"2020-10-08 17:43:21"
{"now":"2020-10-08 17:43:21"}
序列化时启用默认的日期格式
Fastjson内置了一个默认的日期格式yyyy-MM-dd HH:mm:ss,可以通过在调用JSON.toJSONString时传入SerializerFeature.WriteDateUseDateFormat来启用。
/**
* 序列化时启用默认的日期格式
*/
@Test
public void writeDateUseDateFormat() {
Date date = new Date();
System.out.println(JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat));
}
执行结果:
"2020-10-08 17:44:50"
修改默认的日期格式
通过修改默认的时间格式,结合启用默认日期格式,也可以达到按指定日期格式序列化的目的。
/**
* 先修改默认的时间格式,然后序列化时启用默认的日期格式
*/
@Test
public void writeDateUseDateFormat2() {
Date date = new Date();
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
System.out.println(JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat));
}
执行结果:
"2020-10-08 17:47:25.016"
默认的反序列化日期格式
Fastjson支持自动识别一些常用的日期格式,例如:
- yyyy-MM-dd
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd HH:mm:ss.SSS
- 毫秒数字
- 毫秒数字字符串
使用JSON.parseObject方法进行反序列化,传入需要反序列化的字符串,和目标类的class对象。
/**
* 默认自动识别一些常用的日期格式
*/
@Test
public void autoDeserializeDate() {
String dateFormat = "yyyy-MM-dd HH:mm:ss";
// yyyy-MM-dd
MyDate myDate = JSON.parseObject("{\"date\":\"2020-10-01\"}", MyDate.class);
System.out.println(JSON.toJSONStringWithDateFormat(myDate, dateFormat));
// yyyy-MM-dd HH:mm:ss
myDate = JSON.parseObject("{\"date\":\"2020-10-01 22:10:05\"}", MyDate.class);
System.out.println("\n" + JSON.toJSONStringWithDateFormat(myDate, dateFormat));
System.out.println(myDate.getDate().getTime());
// yyyy-MM-dd HH:mm:ss.SSS
myDate = JSON.parseObject("{\"date\":\"2020-10-01 22:10:05.875\"}", MyDate.class);
System.out.println("\n" + JSON.toJSONStringWithDateFormat(myDate, dateFormat));
System.out.println(myDate.getDate().getTime());
// 毫秒数字
myDate = JSON.parseObject("{\"date\":1601561405875}", MyDate.class);
System.out.println("\n" + JSON.toJSONStringWithDateFormat(myDate, dateFormat));
System.out.println(myDate.getDate().getTime());
// 毫秒数字字符串
myDate = JSON.parseObject("{\"date\":\"1601561405875\"}", MyDate.class);
System.out.println("\n" + JSON.toJSONStringWithDateFormat(myDate, dateFormat));
System.out.println(myDate.getDate().getTime());
}
执行结果:
{"date":"2020-10-01 00:00:00"}
{"date":"2020-10-01 22:10:05"}
1601561405000
{"date":"2020-10-01 22:10:05"}
1601561405875
{"date":"2020-10-01 22:10:05"}
1601561405875
{"date":"2020-10-01 22:10:05"}
1601561405875
小结
日期格式化在日常开发中比较常见,常用于前端展示和日志打印等场景,格式化后的可读性比较强。
对于日期类型,Fastjson默认会序列化为数字类型,可读性比较差。
序列化日期时,可以调用带日期格式的序列化方法,或者启用默认日期来指定日期格式。
同时,Fastjson支持自动识别一些常用的日期格式,在反序列化时非常方便。
参考
https://github.com/alibaba/fastjson (opens in a new tab)
https://github.com/alibaba/fastjson/wiki/FAQ(English-Version) (opens in a new tab)