json无法反序列化(日期格式导致)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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反序列化,也可以采用这样的方法进行改写。

猜你喜欢

转载自blog.csdn.net/lyl15000183371/article/details/89852005