使用@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;}}@Overridepublic 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”:“**”}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年华为OD机试真题-转盘寿司-Java-OD统一考试(C卷)

题目描述: 寿司店周年庆,正在举办优惠活动回馈新老客户。 寿司转盘上总共有n盘寿司,prices[i]是第i盘寿司的价格,如果客户选择了第i盘寿司,寿司店免费赠送客户距离第i盘寿司最近的下一盘寿司 j,前提是prices[j]< prices[i],如果没有满足条件的 j,则不赠送寿司。 每个…

GPT获取session token

这里写自定义目录标题 概述通过浏览器获取session token通过ChatGPT网页获取session token 概述 ChatGPT是一种基于人工智能的对话模型&#xff0c;由OpenAI开发。通过使用ChatGPT的API&#xff0c;用户可以实现智能对话的功能。这篇文章将介绍如何获取ChatGPT Session Token以…

leetcode 67. 二进制求和

一、题目 二、解答 1.思路 1.1 思路1 转成2个二进制数字相加&#xff0c;之后再转回字符串 1.2 思路2 遍历字符串挨个相加&#xff1a; 补齐2个字符串到同样长度 while循环&#xff0c;如果指针>0不断循环如果a短&#xff0c;给字符串前插入&#xff08;a长度-b长度&a…

Java:多线程问题小结(二)

21、FutureTask是什么 这是一个比较偏实践的问题&#xff0c;这种问题我觉得挺有意义的。可以这么做&#xff1a; &#xff08;1&#xff09;获取项目的pid&#xff0c;jps或者ps -ef | grep java&#xff0c;这个前面有讲过 &#xff08;2&#xff09;top -H -p pid&#xff…

npm link 后怎么查看软连接和删除软连接的

一&#xff1a;在你的npm项目中&#xff0c;进行打包&#xff0c;形成一个dist文件 npm run build // 这是我的打包命令&#xff0c;具体可查看 package.json 文件 二&#xff1a; 打包完成后&#xff0c;运行pwd命令&#xff0c;可查看到你npm项目的路径。 pwd // 输出一…

Java开发笔记

一、参数校验 1、校验json字符串是否符合规范 &#xff08;1&#xff09;业务场景&#xff1a;接收前端传输过来的json串&#xff0c;需要将其写入数据库&#xff0c;写入之前需要校验其是否能够转换成对应实体类&#xff0c;以便后续从数据库读取   &#xff08;2&#xff0…

【Java 设计模式】创建型之工厂方法模式

文章目录 1. 定义2. 应用场景3. 代码实现4. 应用示例结语 在软件开发中&#xff0c;工厂方法模式是一种常见的创建型设计模式&#xff0c;它提供了一种将对象的实例化延迟到子类的方法。工厂方法模式通过定义一个创建对象的接口&#xff0c;但是让子类决定实例化哪个类。在本文…

C++ Primer 6.3 返回类型和return语句 知识点+练习题

C Primer 6.3 返回类型和return语句 无返回值函数有返回值的函数两个错误值是如何被返回的返回类类型的函数和调用运算符引用返回左值列表初始化返回值主函数main的返回值返回数组指针 递归练习题疑问待更新 无返回值函数 用在返回值类型为void的函数中&#xff0c;可以不写re…

若依基于jsencrypt实现前后端登录密码加密

若依虽然有加密解密功能&#xff0c;然后只有前端有&#xff0c;在用户点击保存密码的时候&#xff0c;会将密码保存到本地&#xff0c;但是为了防止密码泄露&#xff0c;所以在保存的时候&#xff0c;进行加密&#xff0c;在回显密码的时候进行解密显示&#xff0c;用户在登录…

29 旋转工具箱

效果演示 实现了一个菜单按钮的动画效果&#xff0c;当鼠标悬停在菜单按钮上时&#xff0c;菜单按钮会旋转315度&#xff0c;菜单按钮旋转的同时&#xff0c;菜单按钮旋转的8个小圆圈也会依次旋转360度&#xff0c;并且每个小圆圈的旋转方向和菜单按钮的旋转方向相反&#xff0…

数据结构期末复习(4)串 树和二叉树

串 在数据结构中&#xff0c;串是由零个或多个字符组成的有限序列。它是一种线性数据结构&#xff0c;常用于表示和处理文本、字符串等信息。 串的特点包括&#xff1a; 顺序性&#xff1a;串中的字符按照一定的先后顺序排列&#xff0c;每个字符都有一个唯一的位置。有限性&…

MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器

系列文章目录 前言 本示例展示了如何利用非线性模型预测控制&#xff08;MPC&#xff09;为四旋翼飞行器设计一个跟踪轨迹的控制器。 一、四旋翼模型 四旋翼飞行器有四个向上的旋翼。从四旋翼飞行器的质量中心出发&#xff0c;旋翼呈等距离的正方形排列。四旋翼飞行器动力学数…

记一次文件上传引发的OSS_ACCESS_KEY泄露

文章目录 一、漏洞原因二、漏洞成果三、漏洞利用0x01 任意用户注册0x02 文件上传处泄露OSS_AK0x03 OSS管理四、总结五、免责声明一、漏洞原因 由于是教育系统,可以进行任意用户注册;由于在身份认证的模块,可以进行文件上传,返回数据包中泄露OSS_ACCESS_KEY;通过图形化管理工…

【LeetCode】1. 两数之和(简单)——代码随想录算法训练营Day06

题目链接&#xff1a;1. 两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素…

uboot工作原理介绍

uboot其实和电脑的BIOS是一个原理&#xff0c;它主要做两件事: &#xff08;1&#xff09;初始化硬件&#xff1b; &#xff08;2&#xff09;将系统文件&#xff08;或者说是内核&#xff09;从flash中读出来加载到DDR里面执行。 给大家解释下面几个问题&#xff1a; 为什么…

zabbix6.4设置网络设备端口流量P95

P95概念&#xff1a; p95函数写法&#xff1a; 需要监控P95的设备如下&#xff1a; 先找到原来的端口接收发送速率的监控项&#xff1a; 可以看到他们归属于自动发现规则&#xff1a;端口表UP 找到自动发现规则&#xff1a; 点击创建监控项原型&#xff1a; 公式如下&#xff…

吴恩达-从人类反馈中进行强化学习RLHF

吴恩达-从人类反馈中进行强化学习RLHF https://www.bilibili.com/video/BV1R94y1P7QX?p1&vd_sourcee7939b5cb7bc219a05ee9941cd297ade 1、公开的LLM&#xff0c;Llama2&#xff0c; 使用LLM对同一个提示产生多个不同输出&#xff0c;然后人类评估这些输出。评估方法是对比…

数据结构【树+二叉树】

目录 线性表和非线性表 树的概念 树的存储表示 二叉树的概念 特殊二叉树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 本篇我们开始进入数据结构中【树】的学习。 线性表和非线性表 逻辑结构&#xff1a;人想象出来的物理结构&#xf…

【昕宝爸爸小模块】浅谈之创建线程的几种方式

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

JVM实战(14)——Young GC调优

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…