版权声明:大家好,我是笨笨,笨笨的笨,笨笨的笨,转载请注明出处,谢谢! https://blog.csdn.net/jx520/article/details/89705280
FastJson 自定义 反序列化 java.sql.Time 支持时间格式 HH:SS
确认版本
首先要说的是 fastJson 到 1.2.43 版本才支持 java.sql.Time
https://github.com/alibaba/fastjson/releases/tag/1.2.43
所以要解决这个问题可以升级到1.2.43
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.43</version>
</dependency>
支持自定义时间格式 HH:mm
升级后你会发现 HH:mm:ss
格式的时间已经可以正常工作了。但问题是,我们这次要用 HH:mm
。FastJson给我们提供了自定义的途径。
1.实现 ObjectDeserializer
接口
package com.jerry.util;
import java.lang.reflect.Type;
import java.sql.Time;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
/**
* 自定义 {@link java.sql.Time} 时间类型反序列化规则。<br>
* 支持格式为 <b>HH:ss</b>
* @author jerryjin
*
*/
public class SqlTimeDeserializer implements ObjectDeserializer {
@SuppressWarnings("unchecked")
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
Object val = parser.parse();
if(val != null){
String timeStr = val.toString(); //格式为 HH:ss
if( timeStr.indexOf(":") == 2 && timeStr.length() == 5 ){
return (T) Time.valueOf(val + ":00");
}
}
return null;
}
@Override
public int getFastMatchToken() {
return 0;
}
}
2.在字段上添加注解 @JSONField(deserializeUsing = SqlTimeDeserializer.class)
- format=“HH:mm” 设置的是序列化为JSON字符串的格式
- deserializeUsing = SqlTimeDeserializer.class 告诉FastJson用我们自己定义的反序列化规则
package com.jerry.dto;
import java.sql.Time;
import com.alibaba.fastjson.annotation.JSONField;
import com.jerry.util.SqlTimeDeserializer;
public class Shop implements java.io.Serializable {
private static final long serialVersionUID = 3383929519278011951L;
private Long id;
/** 营业开始标准时间 */
@JSONField(format="HH:mm")
private Time standardOpeningHours;
/** 营业结束标准时间 */
@JSONField(format="HH:mm")
private Time standardClosingHours;
/** 营业开始时间 */
@JSONField(format="HH:mm", deserializeUsing = SqlTimeDeserializer.class)
private Time openingHours;
/** 营业结束时间 */
@JSONField(format="HH:mm", deserializeUsing = SqlTimeDeserializer.class)
private Time closingHours;
//-----------------------------------------------
// get,set 略
// toString 略
}
跑起来
测试用例
package com.jerry.entity;
import java.sql.Time;
import java.util.Date;
import org.apache.commons.lang3.time.DateUtils;
import com.alibaba.fastjson.JSONObject;
import com.jerry.BaseLogTest;
import com.jerry.dto.Shop;
// BaseLogTest 是自己定义的父类,实现了 JUnit 输入日志到控制台的能力
public class ShopTest extends BaseLogTest {
/**
* 测试:SqlTime 转 JsonString
*/
public void testSqlTimeToJsonString() {
Shop shop = new Shop();
shop.setId(111L);
shop.setStandardOpeningHours(new Time(new Date().getTime() ));// 当前时间
shop.setStandardClosingHours(new Time(new Date().getTime() + DateUtils.MILLIS_PER_HOUR * 8));// 当前时间 + 8小时
shop.setOpeningHours(Time.valueOf("12:10:00"));
shop.setClosingHours(Time.valueOf("20:20:00"));
String jsonString = JSONObject.toJSONString(shop);
log.out("【jsonString】 : \n" + jsonString.toString());
}
/**
* 测试:JsonString 转 SqlTime (格式为:HH:mm:ss)
*/
public void testSqlTimeStandard() {
String jsonString = "{\"id\": 222,\"standardOpeningHours\":\"1:59:59\",\"standardClosingHours\":\"3:30:30\",\"openingHours\":\"12:10:00\",\"closingHours\":\"20:20:00\"}";
Shop shop = JSONObject.parseObject(jsonString, Shop.class);
log.out("【Standard time】 : \n" + shop.toString());
}
/**
* 测试:JsonString 转 SqlTime (格式含:HH:mm)
*/
public void testSqlTime() {
String jsonString = "{\"id\": 222,\"standardOpeningHours\":\"1:59:59\",\"standardClosingHours\":\"3:30:30\",\"openingHours\":\"12:10\",\"closingHours\":\"20:20\"}";
Shop shop = JSONObject.parseObject(jsonString, Shop.class);
log.out("【HH:ss time】 : \n" + shop.toString());
}
}
看输出结果
----------------------log.out begin-------------------------------
【jsonString】 :
{"closingHours":"20:20","id":111,"openingHours":"12:10","standardClosingHours":"19:15","standardOpeningHours":"11:15"}
-----------------------log.out end--------------------------------
----------------------log.out begin-------------------------------
【Standard time】 :
ServingDTO [id=222, standardOpeningHours=01:59:59, standardClosingHours=03:30:30, openingHours=null, closingHours=null]
-----------------------log.out end--------------------------------
----------------------log.out begin-------------------------------
【HH:ss time】 :
ServingDTO [id=222, standardOpeningHours=01:59:59, standardClosingHours=03:30:30, openingHours=12:10:00, closingHours=20:20:00]
-----------------------log.out end--------------------------------