FastJson 自定义反序列化类

反序列化类

package com.seliote.demo.test;

import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONToken;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import org.springframework.util.Assert;

import java.lang.reflect.Type;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.LinkedList;
import java.util.List;

/**
 * FastJson 时间格式自定义反序列化类
 *
 * @author LiYangDi
 * @since 2019/12/23
 */
public class FastJsonLocalDateTimeDeserializer implements ObjectDeserializer {

    private static List<DateTimeFormatter> dateTimeFormatters = new LinkedList<>();

    static {
        // Add your own formatter to there
        dateTimeFormatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        dateTimeFormatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
        dateTimeFormatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"));
        dateTimeFormatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"));
    }

    @SuppressWarnings("unchecked")
    @Override
    public LocalDateTime deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        final String input = parser.lexer.stringVal();
        LocalDateTime localDateTime = null;
        for (DateTimeFormatter dateTimeFormatter : dateTimeFormatters) {
            try {
                localDateTime = LocalDateTime.parse(input, dateTimeFormatter);
                // Format success, step over other DateTimeFormatter
                break;
            } catch (DateTimeParseException ex) {
                // do nothing to use next formatter
            }
        }
        Assert.notNull(localDateTime, "FastJson LocalDateTime use" +
                " FastJsonTimestampDeserializer format error: " + input);
        return localDateTime;
    }

    @Override
    public int getFastMatchToken() {
        return JSONToken.LITERAL_INT;
    }
}

测试

POJO

package com.seliote.demo.pojo;

import com.alibaba.fastjson.annotation.JSONField;
import com.seliote.demo.test.FastJsonLocalDateTimeDeserializer;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 测试 POJO
 *
 * @author LiYangDi
 * @since 2019/12/23
 */
@Data
public class Pojo {

    @JSONField(name = "time", deserializeUsing = FastJsonLocalDateTimeDeserializer.class)
    //@JSONField(name = "time")
    private LocalDateTime localDateTime;

    @JSONField(name = "name")
    private String name;
}

测试类

package com.seliote.demo.test;

import com.alibaba.fastjson.JSONObject;
import com.seliote.demo.pojo.Pojo;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>
 * 测试类
 * </p>
 *
 * @author LiYangDi
 * @since 2019/11/20
 */
@Slf4j
public class FastJsonTest {

    public static void main(String... args) {
        final String json = "{\"time\":\"2019-12-23 20:18:02.111111111\", \"name\":\"seliote\"}";
        Pojo pojo = JSONObject.parseObject(json, Pojo.class);
    }
}
上一篇:通过DateTimeFormatter格式器格式化日期时间


下一篇:Java 之 JDK 1.8 新增日期时间类型