当前位置: 首页 > 工具软件 > JsonSerialize > 使用案例 >

@JsonSerialize和@JsonDeserialize的使用详解

濮阳旺
2023-12-01

背景:

在项目中处理数据时需要对所有的金额格式化操作,具体做法是,后端接收的金额类数据单位需要由万元转换为元在存入数据库,而返回到前端的金额类数据又必须由元转换为万元返回,以便保持数据一致。

如果用传统方式,在保存和返回时加上转换的处理,需要复杂且繁琐的操作,jackson提供了JsonSerialize和JsonDeserialize注解来优雅的解决这个问题,项目采用的springboot框架,而springboot框架默认配置json转换工具就是jackson。如此,使用注解解决问题很nice了。

 

注解简介:

1. @JsonSerialize:json序列化注解,用于字段或get方法上,作用于getter()方法,将java对象序列化为json数据

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) //include里面包含了序列化的范围和作用的规则,本行作用是属性为null的时候不进行序列化操作。

@JsonSerialize(using = Bean.class) //Bean 为实现类,Bean需要继承JsonSerializer<>,泛型就是作用字段的类型。

2. @JsonDeserialize:json反序列化注解,用于字段或set方法上,作用于setter()方法,将json数据反序列化为java对象。使用方法同@JsonSerialize类似。

3.常用于对数据进行简单的特殊处理,比如本次项目实践用到的,对金额类数据进行格式化操作。

 

需要注意的是,该注解只在json序列化和反序列化的时候触发,其他时候并不生效!

注意:json序列化及反序列化注解通常用在前后端传值上,作用于get,set方法上,但并不是重写get,set方法,而是类似于补充,追加。

理解注解的作用和触发很重要,这能帮助我们知道该怎样来使用它!

 

项目实践:

1.使用

@JsonSerialize(using = BudgetSerializer.class)
@JsonDeserialize(using = BudgetDeserializer.class)
private BigDecimal applyBudget;

由于字段用于存储金额,所以采用了BigDecimal类。

2.自定义实现类

首先需要自定义序列化及反序列化实现类,继承JsonSerializer<BigDecimal>类和JsonDeserializer<BigDecimal>,由于字段采用BigDecimal,所以泛型也使用BigDecimal

BudgetSerializer:
@Slf4j
public class BudgetSerializer extends JsonSerializer<BigDecimal> {

    @Override
    public void serialize(BigDecimal s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        BigDecimal format = s;
        if (format != null) {
            // 元转万元
            format = format.divide(new BigDecimal("10000"), 4, BigDecimal.ROUND_HALF_DOWN);
            log.debug("元格式化万元:前 {}, 后 {}", s, format);
        }

        jsonGenerator.writeNumber(format);
    }
}

作用:在返回给前端金额参数的时候,把数据库中的数据由元格式化为万元,就是除10000的操作。
 

BudgetDeserializer:
@Slf4j
public class BudgetDeserializer extends JsonDeserializer<BigDecimal> {
    @Override
    public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        try {
            if (jsonParser == null || jsonParser.getText() == null) {
                return null;
            }
            String s = jsonParser.getText();
            BigDecimal format = new BigDecimal(StringUtils.isBlank(s) ? "0" : s);

            // 万元转元
            format = format.multiply(new BigDecimal("10000"));
            log.debug("万元格式化元:前 {}, 后 {}", s, format);
            return format;
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new RuntimeException(e);
        }
    }
}

作用:在后端接收前端金额参数的时候,把前端的数据由万元格式化为元,就是乘10000的操作。

 

如此,对金额格式化操作就完成了。简单,省事,快捷。

 类似资料: