Fastjson2自定义序列化类序列化时间
目录
fastjson2自定义序列化类序列化时间
场景:在调用算法接口的时候,返回的时间字段序列化为时间戳,但是是秒级的,fastjson2在反序列化的时候呢默认是毫秒,这就导致了序列化出来的时间是1970年。和算法人员沟通后呢,算法测表示这个时间改不了一点,只能是秒级的,"这个数乘不了1000", 当然了,我们又不懂算法,谁叫人家NB呢?人家说了做不了那就只有自己来实现咯。
解决方案一
获取返回的结果,将这个字段的值获取后再自己乘上1000后重新赋值
解决方案二(推荐)
上面的方案:不具有通用性,如果其他接口返回的数也是秒级的时间戳,那还要循环遍历去处理,所以我们采用自定义序列化的方式来解决
通过查阅官方文档
自定义序列化需要实现com.alibaba.fastjson2.writer.ObjectWriter
接口,反序列化需要实现com.alibaba.fastjson2.reader.ObjectReader
接口
创建反序列类
@Slf4j
public class DateDeserializer implements ObjectReader<Date> {
@Override
public Date readObject(JSONReader jsonReader, Type type, Object fieldName, long l) {
try {
long dateTime = jsonReader.readInt64();
return new Date(dateTime * 1000);
} catch (SecurityException | IllegalArgumentException e) {
log.error("error: ", e);
}
return null;
}
}
使用
通过使用注解: @JSONField(deserializeUsing = DateDeserializer.class)
@Data
public class IntentionAnalysisOutput implements Serializable {
@Schema(description = "意图id")
private Long id;
@Schema(description = "文件id")
private Long fileId;
@Schema(description = "意图分析")
private String intentionAnalysis;
@Schema(description = "分析时间")
@JsonFormat(pattern = Constants.INPUT_TIME_FORMAT)
@JSONField(deserializeUsing = DateDeserializer.class)
private Date analysisTime;
@Schema(description = "开始时间")
@JsonFormat(pattern = Constants.INPUT_TIME_FORMAT)
@JSONField(deserializeUsing = DateDeserializer.class)
private Date startTime;
@Schema(description = "结束时间")
@JsonFormat(pattern = Constants.INPUT_TIME_FORMAT)
@JSONField(deserializeUsing = DateDeserializer.class)
private Date endTime;
@Schema(description = "圆心x坐标")
private String pointX;
@Schema(description = "圆心y坐标")
private String pointY;
}