@JsonSerialize和@JsonDeserialize的使用详解

15 篇文章 1 订阅

背景:

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

如果用传统方式,在保存和返回时加上转换的处理,需要复杂且繁琐的操作,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的操作。

 

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

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
@JsonSerialize是Spring Boot默认提供的解析Json的Jackson工具包下的注解。它可以用于将被转换的字段自动转换为指定的类型。在使用时,将该注解定义在字段上即可。比如,如果想要将Long类型的字段转换为String类型,可以在该字段上使用@JsonSerialize注解,并指定使用ToStringSerializer类进行转换。例如,使用@JsonSerialize(using = ToStringSerializer.class)注解来将Long类型的字段转换为String类型。这样,在Json序列化的时候,该字段会被自动转换为String类型。可以避免转换失败的问题。另外,如果需要自定义序列化器,可以创建一个继承自JsonSerializer的类,并在其中重写serialize方法实现自定义的转换逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [解决@JsonSerialize注解失效的问题](https://blog.csdn.net/huangjhai/article/details/119880829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [@JsonDeserialize和@JsonSerialize注解的使用](https://blog.csdn.net/qq_58772217/article/details/127618020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值