赞
踩
首先要说的是 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:ss
格式的时间已经可以正常工作了。但问题是,我们这次要用 HH:mm
。FastJson给我们提供了自定义的途径。
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; } }
@JSONField(deserializeUsing = SqlTimeDeserializer.class)
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--------------------------------
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。