反序列化类
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 */@Datapublic 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 */@Slf4jpublic 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); }}