Fastjson教程
日期序列化

在日常开发中,日期是很常见的一种数据类型,特别是在与数据库打交道的场景。

为了提升日期的可读性,通常会将日期进行格式化之后再输出,用于前端展示和日志打印等场景。

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)