Java中json格式化BigDecimal保留2位小數(shù)
場(chǎng)景
如下,在處理錢相關(guān)的業(yè)務(wù)時(shí),接口明明已經(jīng)保留了兩位小數(shù) 1.00 ,但前端接收的時(shí)候獲取的卻是 1 ,小數(shù)點(diǎn)后面的‘0’沒(méi)了。
@Data
public class UserVo {
long id;
String name;
BigDecimal money;
}其實(shí),需要在 BigDecimal 參與 json 轉(zhuǎn)化時(shí),將其轉(zhuǎn)化成 String 類型即可。
一. Jackson的處理方式
1.編寫(xiě)一個(gè)類,實(shí)現(xiàn) JsonSerializer ,并實(shí)現(xiàn) serialize 方法
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;
public class BigDecimalSerialize extends JsonSerializer{
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if(o != null && o instanceof BigDecimal){
BigDecimal bigDecomal = (BigDecimal) o;
jsonGenerator.writeString(bigDecomal.setScale(2,BigDecimal.ROUND_DOWN)+"");
}
}
}2.在需要特殊處理的屬性上加上這個(gè)注解 @JsonSerialize ,并將第一步創(chuàng)建好的類名加到參數(shù)中
@JsonSerialize(using = BigDecimalSerialize.class) BigDecimal money;
以下是在測(cè)試類中測(cè)試的場(chǎng)景
@Test
public void jacksonFormat() throws JsonProcessingException {
UserVo userVo = new UserVo();
userVo.setMoney(new BigDecimal(1.000));
ObjectMapper mapper = new ObjectMapper();
String result=mapper.writeValueAsString(userVo);
System.out.println("result = " + result);
}看下測(cè)試結(jié)果,成功保留了對(duì)應(yīng)的小數(shù)位數(shù),并幫我們轉(zhuǎn)成了String類型,很完美

二. FastJson的處理方式
1.編寫(xiě)一個(gè)類,實(shí)現(xiàn) ValueFilter ,并實(shí)現(xiàn) process 方法
import com.alibaba.fastjson.serializer.ValueFilter;
import java.math.BigDecimal;
public class BigDecimalValueFilter implements ValueFilter {
@Override
public Object process(Object object,String name,Object value){
if(null != value&&value instanceof BigDecimal){
BigDecimal bigDecimal = (BigDecimal) value;
return bigDecimal.setScale(5,BigDecimal.ROUND_DOWN).toString();
}
return value;
}
}2.使用的時(shí)候需要在后面加上我們自定義的的類對(duì)象,如下
JSON.parseObject(JSON.toJSONString(userVo, new BigDecimalValueFilter()))
同樣測(cè)試下看看效果如何
@Test
public void fastJsonFormat(){
UserVo userVo = new UserVo();
userVo.setMoney(new BigDecimal(1.000));
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(userVo, new BigDecimalValueFilter()));
System.out.println("jsonObject = " + jsonObject);
}打印結(jié)果

總結(jié)
到此這篇關(guān)于Java中json格式化BigDecimal保留2位小數(shù)的文章就介紹到這了,更多相關(guān)json格式化BigDecimal內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析
這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn)
這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
MySQL text類型對(duì)應(yīng)mybatis jdbcType類型方式
這篇文章主要介紹了MySQL text類型對(duì)應(yīng)mybatis jdbcType類型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
詳談HashMap和ConcurrentHashMap的區(qū)別(HashMap的底層源碼)
下面小編就為大家?guī)?lái)一篇詳談HashMap和ConcurrentHashMap的區(qū)別(HashMap的底層源碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
源碼解析springbatch的job運(yùn)行機(jī)制
這篇文章主要介紹了springbatch的job是如何運(yùn)行的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
SpringCloud之微服務(wù)容錯(cuò)的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud之微服務(wù)容錯(cuò)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解
這篇文章主要介紹了Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
spring boot 加載web容器tomcat流程源碼分析
本文章主要描述spring boot加載web容器 tomcat的部分,為了避免文章知識(shí)點(diǎn)過(guò)于分散,其他相關(guān)的如bean的加載,tomcat內(nèi)部流程等不做深入討論,具體內(nèi)容詳情跟隨小編一起看看吧2021-06-06

