版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyl15000183371/article/details/89852005
背景
在项目对接中,有可能json对象里面的日期是这样的:2019-04-28T19:49:28.0000000 。JSONArray在反序列化成指定对象时,会报错。这里我们考虑采用以下方法
上代码
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.ParserConfig;
import java.util.ArrayList;
import java.util.List;
/**
* @author lyl
* @Desc TODO
* @Date 2019/4/18
*/
public class JsonUtil {
public static final <T> List<T> parseArray(String text, Class<T> clazz,ParserConfig config) {
if (text == null) {
return null;
} else {
DefaultJSONParser parser = new DefaultJSONParser(text, config);
JSONLexer lexer = parser.getLexer();
ArrayList list;
int tok = 8;
if (lexer.token() == tok) {
lexer.nextToken();
list = null;
} else {
list = new ArrayList();
parser.parseArray(clazz, list);
parser.handleResovleTask(list);
}
parser.close();
return list;
}
}
}
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.DateFormatDeserializer;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @author lyl
* @Desc TODO
* @Date 2019/4/18
*/
public class MyDateFormatDeserializer extends DateFormatDeserializer {
@Override
protected <T> T cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object value) {
if(value == null) {
return null;
} else if(value instanceof Calendar) {
return (T) ((Calendar)value).getTime();
} else if(value instanceof Date) {
return (T) value;
} else {
long longValue = -1L;
if(value instanceof Number) {
longValue = ((Number)value).longValue();
return (T) new Date(longValue);
} else {
if(value instanceof String) {
String strVal = (String)value;
int strLen=strVal.length();
int strIndex=45;
Map<Integer,String> formats= new HashMap<>(5);
// 这里按需添加
formats.put(10,"yyyy-MM-dd");
formats.put(16,"yyyy-MM-dd HH:mm");
formats.put(19,"yyyy-MM-dd HH:mm:ss");
formats.put(23,"yyyy-MM-dd HH:mm:ss.SSS");
formats.put(27,"yyyy-MM-dd'T'HH:mm:ss.SSSSSSS");
if(strVal.indexOf(strIndex) != -1) {
String format;
if(formats.containsKey(strLen)){
format=formats.get(strLen);
}else{
format = "yyyy-MM-dd HH:mm:ss.SSS";
}
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
try {
return (T) dateFormat.parse(strVal);
} catch (ParseException var7) {
throw new JSONException("can not cast to Date, value : " + strVal);
}
}
if(strVal.length() == 0) {
return null;
}
longValue = Long.parseLong(strVal);
}
if(longValue < 0L) {
throw new JSONException("can not cast to Date, value : " + value);
} else {
return (T) new Date(longValue);
}
}
}
}
}
ParserConfig config = new ParserConfig();
config.putDeserializer(Date.class, new MyDateFormatDeserializer());
List list = JsonUtil.parseArray(dataJson,cls,config);
注意
上面的方法只针对JSONArray,如需对单个JSONObject反序列化,也可以采用这样的方法进行改写。