使用@JsonSerialize注解处理单位换算以及数据默认值

这篇具有很好参考价值的文章主要介绍了使用@JsonSerialize注解处理单位换算以及数据默认值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求

使用@JsonSerialize,来解决单位换算,以及数据为空时返回“**”默认值问题。例如有时候我们需要将金额,以万元的形式返回,需要千分位等等。

注意:如果使用fastjson进行序列化,则本注解不会生效。此注解是jackson包下的。

二、pom依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>

三、通用序列化类定义

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * @Author:
 * @Description 保留一位小数,且以千分位展示数据 例如:3,000.8
 * @Date: 下午4:44 2024/01/15
 */
@Slf4j
public class BigDecimalBaseSerializer extends JsonSerializer<Object> {

    private String format = "#,##0.0";

    private BigDecimal unit = BigDecimal.ONE;

    private DecimalFormat df = new DecimalFormat(format);

    private Integer scaleSize = 1;

    public static final String LINE_STR = "--";

    public BigDecimalBaseSerializer() {
    }

    public BigDecimalBaseSerializer(String format, BigDecimal unit, Integer scaleSize) {
        if (format != null) {
            this.format = format;
            this.df = new DecimalFormat(this.format);
        }
        if (unit != null) {
            this.unit = unit;
        }
        if (scaleSize != null) {
            this.scaleSize = scaleSize;
        }
    }

    @Override
    public void serialize(Object object, JsonGenerator gen, SerializerProvider serializer) throws IOException {
        BigDecimal val = toBigDecimal(object);
        if (val != null) {
            String str = bigDecimalToStr(val);
            gen.writeString(str);
        } else {
            gen.writeString(LINE_STR);
        }
    }

    public String bigDecimalToStr(BigDecimal val) {
        return toString(val, df, this.unit, this.scaleSize);
    }

    public String toString(BigDecimal val, DecimalFormat df, BigDecimal unit, Integer scaleSize) {
        if (BigDecimal.ZERO.equals(val)) {
            return df.format(val);
        } else if (unit != null) {
            val = val.divide(unit, 10, BigDecimal.ROUND_HALF_UP);
            val = val.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
            return df.format(val);
        }
        return LINE_STR;
    }

    public BigDecimal toBigDecimal(Object object) {
        BigDecimal res = null;
        if (object != null) {
            if (object instanceof BigDecimal) {
                res = ((BigDecimal) object);
            } else if (object instanceof String) {
                String str = (String) object;
                if (StringUtils.isNotBlank(str)) {
                    res = new BigDecimal(str);
                }
            } else if (object instanceof Integer) {
                Integer integer = (Integer) object;
                res = new BigDecimal(integer);
            } else if (object instanceof Double) {
                Double doubleVal = (Double) object;
                res = BigDecimal.valueOf(doubleVal);
            } else if (object instanceof Long) {
                Long longVal = (Long) object;
                res = new BigDecimal(longVal);
            } else {
                log.warn("BigDecimal转换异常{}", object.getClass().getTypeName());
            }
        }
        return res;
    }
}

四、以万为单位返回,保留一位小数

import java.math.BigDecimal;

/**
 * @Author:
 * @Description 以万为单位返回,保留一位小数
 * @Date: 下午4:58 2024/01/15
 */
public class TenThousandSerialize extends BigDecimalBaseSerializer {

    private static BigDecimal divisor = new BigDecimal(10000);

    public TenThousandSerialize() {
        super(null, divisor, null);
    }
}

五、以万为单位返回,取整数

/**
 * @Author:
 * @Description 以万为单位返回,取整数
 * @Date: 下午4:58 2024/01/15
 */
public class TenThousandIntegerSerializer extends BigDecimalBaseSerializer {

    private static Integer scaleSize = 0;

    private static BigDecimal divisor = new BigDecimal(10000);

    private static String pattern = "#,##0";

    public TenThousandIntegerSerializer() {
        super(pattern, divisor, scaleSize);
    }
}

六、构建实体类

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;

import java.math.BigDecimal;

/**
 * @Author: 
 * @Description
 * @Date: 下午2:15 2024/01/15
 */
@Data
public class EntityData {

    private String strNum;
    @JsonSerialize(using = TenThousandIntegerSerializer.class, nullsUsing = FieldNullSerializer.class)
    private BigDecimal bdNum;
    @JsonSerialize(using = BigDecimalBaseSerializer.class, nullsUsing = FieldNullSerializer.class)
    private BigDecimal bdNum1;

    @JsonSerialize(nullsUsing = FieldNullSerializer.class)
    private BigDecimal bdNum2;

}

七、测试

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

/**
 * @Author: 
 * @Description
 * @Date: 下午2:37 2024/1/15
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/111")
    public Object test1() {

        EntityData data = new EntityData();
        data.setStrNum(null);
        data.setBdNum(BigDecimal.valueOf(1101010.23));
        data.setBdNum1(BigDecimal.valueOf(1101010.23));
        return data;

    }

}

八、结果

{“strNum”:null,“bdNum”:“110”,“bdNum1”:“1,101,010.2”,“bdNum2”:“**”}文章来源地址https://www.toymoban.com/news/detail-791056.html

到了这里,关于使用@JsonSerialize注解处理单位换算以及数据默认值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring注解 @EventListener 的介绍与使用示例以及异常处理

    用途 将一个方法标记为监听器,用于监听应用程序事件,事件可以是 ApplicationEvent 实例,也可以是其他任意的对象。 如果一个监听器(被标注的方法)只支持单一的事件类型,那么该方法可以声明一个唯一的参数用来反映要监听的事件类型。 如果一个监听器(被标注的方法

    2024年01月15日
    浏览(74)
  • 【机器人学习】MPU6050数据的换算

    由于近期在搞IMU的姿态解算,需要用一个IMU传感器去进行角度的获取,因此采用了最实惠的MPU6050!通过IIC读取MPU6050后的数据只是简单的数值,并没有物理意义,因此本文主要记录下如何将MPU6050的数据换算成有意义的物理值。 要得到MPU6050的具体参数,那必须是官方的datashe

    2024年02月14日
    浏览(45)
  • GPS网的基线计算以及平差处理(使用Python绘制误差椭圆,C++处理数据并输出Qxx矩阵)

      如下图所示为一简单GPS网,用两台GPS接收机观测,测得5条基线向量,每一条基线向量中三个坐标差观测值相关,由于只用两台GPS接收机观测,所以各观测基线向量互相独立。观测基线向量信息见表1。假定1号点为起算点坐标信息表2。  表1 GPS网平差观测数据及已知方差阵

    2024年02月03日
    浏览(39)
  • Spring Cache的介绍以及使用方法、常用注解

    Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能. Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。 CacheManager是Spring提供的各种缓存技术抽象接口。 针对不同的缓存

    2024年02月16日
    浏览(37)
  • SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用

    什么是 NULL 值? NULL 值是指字段没有值的情况。如果表中的字段是可选的,那么可以插入新记录或更新记录而不向该字段添加值。此时,该字段将保存为 NULL 值。需要注意的是,NULL 值与零值或包含空格的字段不同。具有 NULL 值的字段是在记录创建期间留空的字段。 如何测试

    2024年02月05日
    浏览(50)
  • SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理

    在开发 Web 应用程序时,异常处理是非常重要的一部分。SpringBoot 提供了多种方式来处理异常,其中之一是使用 @ExceptionHandler 注解进行局部异常处理。使用 @ExceptionHandler 注解,我们可以在 Controller 层或方法级别上处理异常,而不用在整个应用程序中处理。 在本文中,我们将介

    2024年02月13日
    浏览(37)
  • SpringBoot 如何使用 @ControllerAdvice 注解进行全局异常处理

    在 Web 开发中,异常处理是非常重要的一环。在 SpringBoot 框架中,我们通常使用 @ExceptionHandler 注解来处理 Controller 层的异常。但是,如果想要处理全局异常,我们需要使用 @ControllerAdvice 注解。本文将介绍如何在 SpringBoot 中使用 @ControllerAdvice 注解进行全局异常处理。 @Controll

    2024年02月10日
    浏览(42)
  • springboot整合多数据源的配置以及动态切换数据源,注解切换数据源

    在许多应用程序中,可能需要使用多个数据库或数据源来处理不同的业务需求。Spring Boot提供了简便的方式来配置和使用多数据源,使开发人员能够轻松处理多个数据库连接。如果你的项目中可能需要随时切换数据源的话,那我这篇文章可能能帮助到你 ℹ️:这里对于pom文件

    2024年02月10日
    浏览(49)
  • Spring Boot中的@EnableWebSocketMessageBroker注解是什么,原理,以及如何使用

    WebSocket是一种在Web浏览器和Web服务器之间进行双向通信的技术。在传统的HTTP通信中,客户端向服务器发送请求,服务器响应请求,然后关闭连接。而在WebSocket中,客户端和服务器之间的连接始终保持打开状态,可以随时互相发送消息,实现实时通信。 Spring Boot提供了对WebSo

    2024年02月12日
    浏览(70)
  • SpringMVC的常用注解,参数传递以及页面跳转的使用

    目录 slf4j 常用注解 @RequestMapping @RequestParam @RequestBody @PathVariable 参数传递  首先在pom.xml配置文件中导入SLF4J的依赖 基础类型+String   复杂类型 @RequestParam @PathVariable @RequestBody  增删改查  返回值 void返回值  String返回值 model+String   页面跳转 --转发和重定向 SLF4J,简单日志门面

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包