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;

}
0%