码迷,mamicode.com
首页 > Web开发 > 详细

FastJson 自定义反序列化类

时间:2019-12-23 22:14:23      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:ack   not   parser   link   orm   swa   poj   pac   dem   

反序列化类

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

FastJson 自定义反序列化类

标签:ack   not   parser   link   orm   swa   poj   pac   dem   

原文地址:https://www.cnblogs.com/seliote/p/12088661.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!