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