正確的指定日期序列化與反序列化

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章