FastJson 自定义 反序列化 java.sql.Time 支持时间格式 HH:SS

版权声明:大家好,我是笨笨,笨笨的笨,笨笨的笨,转载请注明出处,谢谢! https://blog.csdn.net/jx520/article/details/89705280

确认版本

首先要说的是 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--------------------------------

猜你喜欢

转载自blog.csdn.net/jx520/article/details/89705280
今日推荐