最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示問題踩坑實(shí)戰(zhàn)

 更新時(shí)間:2024年04月12日 09:56:55   作者:小lee編程  
BigDecimal是處理高精度的浮點(diǎn)數(shù)運(yùn)算的常用的一個(gè)類當(dāng)需要將BigDecimal中保存的浮點(diǎn)數(shù)值打印出來,這篇文章主要給大家介紹了關(guān)于Java中BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示問題踩坑的相關(guān)資料,需要的朋友可以參考下

前言:

在生產(chǎn)中出現(xiàn)一個(gè)問題,就是BigDecimal類型的字段在前端頁面展示變成科學(xué)計(jì)數(shù)法,通過排查,發(fā)現(xiàn)里面的坑還是挺多的,所以特意記錄下處理過程。Json序列化,不同項(xiàng)目中配置的都不一樣,有些項(xiàng)目是使用springboot里面自帶的jackson的,有些是使用fastjson處理,不同的序列化的處理方式也不一樣。

1、fastJson對BigDecimal序列化和反序列化

字段返回完整的數(shù)字,避免科學(xué)計(jì)數(shù)法

我們看下JSON.toJSONString()的方法,我們可以看到,可以傳進(jìn)SerializerFeature的枚舉

public static String toJSONString(Object object, SerializerFeature... features) {
    return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
}

所以,我們這邊傳進(jìn)WriteBigDecimalAsPlain枚舉,就可以將數(shù)字完整返回

private static final SerializerFeature[] features = {
        SerializerFeature.WriteBigDecimalAsPlain};
public static String toString(Object data) {
        return JSON.toJSONString(data, features);
    }

PS: 大坑,我們可以發(fā)現(xiàn)這時(shí)候后端返回給前端是完整的數(shù)字,但是由于字段是數(shù)字類型,所以前端JS會把數(shù)字變成科學(xué)計(jì)數(shù)法展示,如下圖展示,左邊的數(shù)據(jù)是瀏覽器響應(yīng)的數(shù)據(jù),右邊的數(shù)據(jù)是postman調(diào)用返回的數(shù)據(jù),可以看到后端返回是沒問題,但是由于前端JS的問題導(dǎo)致展示出現(xiàn)科學(xué)計(jì)數(shù)法。這時(shí)候,我們就需要考慮是不是返回給前端序列化成字符串類型返回。

1.1 fastJson對BigDecimal轉(zhuǎn)成字符串類型返回(全局處理,推薦)

自定義序列化類實(shí)現(xiàn)ObjectSerializer接口重寫里面write方法,并且把自定義序列化類放到fastJson序列化配置中

public class BigDecimalConfig implements ObjectSerializer {
    public static final BigDecimalConfig instance = new BigDecimalConfig();
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
                      int features) throws IOException {
        SerializeWriter out = serializer.out;
        if (object == null) {
            out.writeNull();
            return;
        }
        out.writeString(((BigDecimal) object).stripTrailingZeros().toPlainString());
    }
}
public class JsonUtils {

    private static final SerializerFeature[] features = {
            SerializerFeature.WriteBigDecimalAsPlain	};
    
    private static final SerializeConfig serializeConfig  = SerializeConfig.globalInstance;

    static {
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);//打開autotype功能
        serializeConfig.put(BigDecimal.class, BigDecimalConfig.instance);//將BigDecimal轉(zhuǎn)成字符串類型
    }

    /**
     * 生成JSON字符串
     */
    public static String toString(Object data) {
        return JSON.toJSONString(data, serializeConfig, features);// 需要傳入自定義的配置
    }
}

1.2 fastJson對BigDecimal轉(zhuǎn)成字符串類型返回(局部特定處理)

由于項(xiàng)目前端歷史問題,如果把BigDecimal類型的字段全部變成字符串類型,就有可能會引起其他問題,為了減少不必要的麻煩,特意搞了局部處理的方法,對某個(gè)字段做特殊處理。同樣需要自定義序列化類實(shí)現(xiàn)ObjectSerializer接口重寫里面write方法,然后在字段上加上序列化注解即可。@JSONField(serializeUsing = BigDecimalSerializer.class)

public class BigDecimalSerializer implements ObjectSerializer {

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        if (object == null) {
            serializer.out.writeNull();
            return;
        }
        if (object instanceof BigDecimal) {
            // 將BigDecimal轉(zhuǎn)換為字符串形式
            serializer.write(((BigDecimal) object).stripTrailingZeros().toPlainString());
        } else {
            // 非BigDecimal類型,使用默認(rèn)序列化方式
            serializer.write(object);
        }
    }
}
@JSONField(serializeUsing = BigDecimalSerializer.class)
private BigDecimal logisticsPrice;//物流單價(jià)

2、jackson對BigDecimal序列化和反序列化

自定義序列化和反序列類,然后編寫配置類

public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
        gen.writeString(value.stripTrailingZeros().toPlainString());
    }
}
public class BigDecimalDeserializer extends JsonDeserializer<BigDecimal> {

    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return new BigDecimal(p.getValueAsString());
    }
}
@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.modules(new SimpleModule().addSerializer(BigDecimal.class, new BigDecimalSerializer())
                .addDeserializer(BigDecimal.class, new BigDecimalDeserializer()));
        return builder;
    }
}

2.1 jackson對BigDecimal轉(zhuǎn)成字符串類型返回(全局處理)

自定義Jackson的JsonSerializer實(shí)現(xiàn)

public class BigDecimalToStringSerializer extends JsonSerializer<BigDecimal> {

    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(value.stripTrailingZeros().toPlainString());
    }
}

配置類中注冊這個(gè)JsonSerializer

@Configuration
public class JacksonConfig {

//    @Bean
//    public Jackson2ObjectMapperBuilder jacksonBuilder() {
//        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
//        builder.modules(new SimpleModule().addSerializer(BigDecimal.class, new BigDecimalSerializer())
//                .addDeserializer(BigDecimal.class, new BigDecimalDeserializer()));
//        return builder;
//    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(BigDecimal.class, new BigDecimalToStringSerializer());
        objectMapper.registerModule(module);
        return objectMapper;
    }
}

2.2 jackson對BigDecimal轉(zhuǎn)成字符串類型返回(局部處理)

第一步跟之前一樣,自定義BigDecimalToStringSerializer序列化類,然后在某個(gè)字段上加上注解即可,@JsonSerialize(using = BigDecimalToStringSerializer.class)

@JsonSerialize(using = BigDecimalToStringSerializer.class)
private BigDecimal rate;

3、總結(jié)

BigDecimal里面的坑還是挺多的,頁面該類型字段科學(xué)計(jì)數(shù)法展示的話,我們要找清楚是什么原因,是后端返回有問題還是前端的問題,首先一定要保證后端返回的數(shù)據(jù)是正常完整的,不管是數(shù)字類型還是字符串類型。只要確保后端返回的數(shù)據(jù)是完整,剩下如果還有問題就可以協(xié)助前端一起排查處理了。

到此這篇關(guān)于Java中BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示問題踩坑實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)BigDecimal序列化科學(xué)計(jì)數(shù)法前端展示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot創(chuàng)建監(jiān)聽器的方法示例

    SpringBoot創(chuàng)建監(jiān)聽器的方法示例

    在Java中,監(jiān)聽器(Listener)是一種設(shè)計(jì)模式,它允許對象在 特定事件 發(fā)生時(shí) 自動(dòng)執(zhí)行某些操作,這種設(shè)計(jì)模式通常用于實(shí)現(xiàn) 發(fā)布-訂閱模型,本文給大家介紹了SpringBoot創(chuàng)建監(jiān)聽器的方法示例,感興趣的通過可以參考一下
    2024-04-04
  • Java Object類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java Object類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java作為一個(gè)龐大的知識體系,涉及到的知識點(diǎn)繁多,本文將從Java中最基本的類java.lang.Object開始談起,對java object類相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2017-04-04
  • Spring AOP如何自定義注解實(shí)現(xiàn)審計(jì)或日志記錄(完整代碼)

    Spring AOP如何自定義注解實(shí)現(xiàn)審計(jì)或日志記錄(完整代碼)

    這篇文章主要介紹了Spring AOP如何自定義注解實(shí)現(xiàn)審計(jì)或日志記錄(完整代碼),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境的過程

    2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境的過程

    這篇文章主要介紹了2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Spring?Boot?接口加解密功能實(shí)現(xiàn)

    Spring?Boot?接口加解密功能實(shí)現(xiàn)

    在我們?nèi)粘5腏ava開發(fā)中,免不了和其他系統(tǒng)的業(yè)務(wù)交互,或者微服務(wù)之間的接口調(diào)用;如果我們想保證數(shù)據(jù)傳輸?shù)陌踩?,對接口出參加密,入?yún)⒔饷?,這篇文章主要介紹了Spring?Boot?接口加解密功能實(shí)現(xiàn),需要的朋友可以參考下
    2023-04-04
  • Spring整合JUnit詳解

    Spring整合JUnit詳解

    Spring?是目前主流的?Java?Web?開發(fā)框架,是?Java?世界最為成功的框架。該框架是一個(gè)輕量級的開源框架,這篇文章主要介紹如何配置數(shù)據(jù)源、注解開發(fā)以及整合Junit,感興趣的同學(xué)可以參考一下
    2023-04-04
  • Java算法題常用函數(shù)詳解

    Java算法題常用函數(shù)詳解

    這篇文章主要介紹了Java中常用的字符串操作、字符串轉(zhuǎn)換、字符串處理、字符串緩沖區(qū)、棧、數(shù)組、列表、隊(duì)列、優(yōu)先隊(duì)列、Map和HashMap的常用函數(shù)和操作,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 歸并排序的原理及java代碼實(shí)現(xiàn)

    歸并排序的原理及java代碼實(shí)現(xiàn)

    歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列。遞歸形式的算法在形式上較簡潔,但實(shí)用性很差。一般情況下,很少利用二路歸并排序法進(jìn)行內(nèi)部排序。
    2016-02-02
  • Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法

    Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法

    這篇文章主要介紹了Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱介紹

    Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱介紹

    這篇文章主要介紹了Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論

靖西县| 丰顺县| 舟曲县| 道孚县| 卢湾区| 澄江县| 新疆| 阳谷县| 剑河县| 财经| 太湖县| 广水市| 陆川县| 疏勒县| 海淀区| 营口市| 沿河| 富裕县| 井冈山市| 东阳市| 颍上县| 沂源县| 乐都县| 罗甸县| 漠河县| 绥化市| 渭源县| 从江县| 天峻县| 睢宁县| 万州区| 株洲县| 枞阳县| 镇远县| 峨边| 平塘县| 视频| 贺兰县| 玉田县| 朔州市| 东平县|