spring boot - 使用fastjson注解实现序列化和反序列化
以 序列化 LocalDateTime 和将时间戳反序列化成 LocalDateTime 为例。我们知道 spring boot 默认使用jackson实现序列化和反序列化(但是,如果使用 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;
更多推荐
已为社区贡献21条内容
所有评论(0)