@JsonSerialize和@JsonDeserialize的使⽤详解
背景:
在项⽬中处理数据时需要对所有的⾦额格式化操作,具体做法是,后端接收的⾦额类数据单位需要由万元转换为元在存⼊数据库,⽽返回到
前端的⾦额类数据⼜必须由元转换为万元返回,以便保持数据⼀致。
如果⽤传统⽅式,在保存和返回时加上转换的处理,需要复杂且繁琐的操作,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 || Text() == null) {
return null;
}
String s = Text();
BigDecimal format = new BigDecimal(StringUtils.isBlank(s) ? "0" : s);
// 万元转元
format = format.multiply(new BigDecimal("10000"));
log.debug("万元格式化元:前 {}, 后 {}", s, format);
return format;
} catch (Exception e) {
<(e.getMessage());
throw new RuntimeException(e);
}
}
}
作⽤:在后端接收前端⾦额参数的时候,把前端的数据由万元格式化为元,就是乘10000的操作。bigdecimal格式化两位小数
如此,对⾦额格式化操作就完成了。简单,省事,快捷。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。