spring boot - 使用fastjson注解实现序列化和反序列化

spring boot - 使用fastjson注解实现序列化和反序列化

我们知道 spring boot 默认使用jackson实现序列化和反序列化(MappingJackson2CborHttpMessageConverter),如果需要实现自定义序列化器和反序列化器,需要实现的是:

  • JsonSerializer
  • JsonDeserializer

然后使用以下注解

@JsonDeserialize(using = LDTConfig.CmzLdtDeSerializer.class)
private LocalDateTime startTime;

@JsonSerialize(using = LDTConfig.CmzLdtSerializer.class)
private LocalDateTime createdTime;

但是,如果使用 fastjson, 即 FastJsonHttpMessageConverter 作为返回接口转换器,则实现这两个接口就不会生效

fastjson 实现序列和反序列化

以 序列化 LocalDateTime 和将时间戳反序列化成 LocalDateTime 为例

序列化:

public class LocalDateTimeFastSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) {

        if (object != null) {
            if (object instanceof LocalDateTime) {
                LocalDateTime localDateTime = (LocalDateTime) object;
                //将localDateTime转换为中国区(+8)时间戳。
                serializer.write(localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli());
                return;
            }
            throw new RuntimeException("date type exception");
        } else {
            serializer.out.writeNull();
        }
    }
}

反序列化:

public class LocalDateTimeFastDeSerializer implements ObjectDeserializer {

    @Override
    public LocalDateTime deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        Long timestamp = parser.parseObject(Long.class);
        if (LocalDateTime.class.isAssignableFrom((Class<?>) type)) {
            // LocalDateTime 类型
            Instant instant = Instant.ofEpochMilli(timestamp);
            return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        }
        return null;
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }
}

在接收 json 的Dto 中使用注解:


@JSONField(serializeUsing = LocalDateTimeFastSerializer.class)
private LocalDateTime endTime;

//将时间戳反序列化
@JSONField(deserializeUsing = LocalDateTimeFastDeSerializer.class)
private LocalDateTime endTime;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值