fastJson 反序列化帶有指定日期格式的json串時有很多麻煩,踩過一些坑後,把最終解決方案整理如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.ParserConfig;
/**
* 正確的指定日期序列化與反序列化
*/
public class JsonUtil {
/**
* <p>
* 默認的處理方式
* </p>
*/
public static String toJson(Object value) {
return JSON.toJSONString(value);
}
/**
* <p>
* 1.指定日期格式序列化
* 2.除了這個方式外,還可以在實體類字段上使用註解,
* 如: @JSONField(format="MM/dd/yyyy HH:mm:ss")
* 注:註解方式優先級低;多個註解互不影響
* </p>
*/
public static String toJson(Object value, String dateFormat) {
return JSON.toJSONStringWithDateFormat(value, dateFormat);
}
/**
* <p>
* 默認的處理方式
* </p>
*/
public static <T> T getObject(String jsonData, Class<T> clazz) {
return JSON.parseObject(jsonData, clazz);
}
/**
* <p>
* 指定日期格式反序列化
* 仿寫JSON的靜態方法:
* JSON.parseObject(String input, Type clazz, ParserConfig config, ParseProcess processor,
* int featureValues, Feature... features)
* </p>
*/
public static <T> T getObject(String jsonData, Class<T> clazz, String dateFormat) {
if(jsonData == null) {
return null;
}
DefaultJSONParser parser = new DefaultJSONParser(jsonData, ParserConfig.getGlobalInstance(), JSON.DEFAULT_PARSER_FEATURE);
parser.setDateFormat(dateFormat); //設置日期格式
T value = (T) parser.parseObject(clazz);
JSON.handleResovleTask(parser, value);
parser.close();
return (T) value;
}
}