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;
}
}