jackson自定义序列化反序列化

jackson自定义序列化和反序列化

自定义序列化
  • 序列化主要作用在返回数据的时候
  • 以BigDecimal统一返回3位小数为例
  • 自定义序列化处理类
  • 继承jackson的JsonSerializer类,重写serialize方法
/**
 * @author liouwb
 */
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException {
        jsonGenerator.writeString(formatBigDecimal(value));
    }

    /**
     * 保留3位小数
     */
    private String formatBigDecimal(BigDecimal value) {
        if (Objects.nonNull(value) && value.compareTo(BigDecimal.ZERO) >= 0) {
            DecimalFormat df = new DecimalFormat();
            df.applyPattern("0.000");
            return df.format(value);
        }

        return null;
    }
}
  • 使用的时候,可以直接使用Jackson的@JsonSerialize注解
    @JsonSerialize(using = BigDecimalSerializer.class)
    private BigDecimal amount;
自定义反序列化
  • 接收前端传入数据
  • 继承JsonDeserializer类,重写deserialize方法
  • 例子:后端传入前端的图片链接,去掉域名,只保存path部分
/**
 * @author liouwb
 */
public class StaticUrlDeserialize extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        // 前端传入数据
        String text = jsonParser.getText();
        // 域名前缀
        String domain = "https://domain/";
        // 去掉域名保留path
        String path = text.replace(domain, "");
        return path;
    }
}
  • 使用的时候,可以直接使用Jackson的@JsonDeserialize注解
    @ApiModelProperty(value = "用户头像", position = 6)
    @JsonDeserialize(using = StaticUrlDeserialize.class)
    private String avatar;
统一配置自定义序列化、反序列化
  • 也可以使用全局统一配置
  • 统一处理BigDecimal返回格式和日期
/**
 * @author liouwb
 */
@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper ObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        // 自定义序列化BigDecimal
        simpleModule.addSerializer(BigDecimal.class, new BigDecimalSerializer());
        // 自定义日期的序列化和反序列化
        simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        simpleModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        simpleModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        objectMapper.registerModule(simpleModule);

        return objectMapper;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值