Java Long转JSON出现精度丢失问题及解决

 更新时间:2025年12月04日 08:59:56   作者:路远_Programmer  
Java Long类型转JSON时可能因JSON的通用数字类型不指定位数大小及JavaScript整数表达精度限制导致精度丢失,解决方法包括在Java对象中为Long类型字段添加@JsonFormat(shape=JsonFormat.Shape.STRING)注解,或在Spring框架中配置ObjectMapper以全局序列化行为

问题分析

Java Long 类型转为 JSON 时可能出现精度丢失的原因主要包括 JSON 的通用数字类型不指定位数大小以及JavaScript 存储大数字时的精度限制。‌

  • JSON 的通用数字类型不指定位数大小:‌JSON 作为一种跨平台的数据交换格式,‌其数字类型是通用的,‌不指定位数大小。‌这意味着在将Java中的Long类型(‌ 64位 有符号整数,‌范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807)‌序列化为 JSON 字符串时,‌如果数字超出了 JSON 能够精确表示的范围,‌就可能导致精度丢失。‌
  • JavaScript 存储大数字时的精度限制:‌在 JavaScript 中,‌整数表达存在精度限制,‌最多能表达的数字位数为 15 位。‌当数字超过 15 位时,‌JavaScript会出现精度丢失问题,‌表现为数字被截断或以科学计数法表示。‌
  • 例如,‌当 JavaScript 尝试表示一个超过 15位 的整数时,‌最后几位数字可能会变为0,‌导致精度丢失。‌

解决方案

  • 局部设置:‌在 Java 对象中,‌可以为 Long 类型的字段添加 @JsonFormat(shape = JsonFormat.Shape.STRING)注解,‌这样在序列化为 JSON 时,‌Long 类型会 被当作字符串处理,‌从而避免精度丢失问题。‌
  • 全局设置:‌在 Spring 框架中,‌可以通过配置  ObjectMapper来设置全局的序列化行为,‌例如使用 ToStringSerializer来确保 Long 类型被序列化为字符串格式,‌或者在配置中添加自定义的序列化模块来处理 Long 类型的序列化。‌

问题实例

后端

前端

前端后端数据的 id 是对不上的!!!! 前端接收的数据中id后三位是不对的,出现了精度丢失。

解决方法

添加一个全局配置

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 * Spring MVC Json 配置
 *
 * @author lhd
 */
@JsonComponent
public class JsonConfig {

    /**
     * 添加 Long 转 json 精度丢失的配置
     */
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        SimpleModule module = new SimpleModule();
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(module);
        return objectMapper;
    }
}

前后端数据中的 id 对上了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用MyBatis从hive中读取数据

    使用MyBatis从hive中读取数据

    Hive是一个基于Hadoop的数据仓库工具,它可以方便地对大规模数据进行查询和分析,本文主要介绍了使用MyBatis从hive中读取数据,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Xml中使用foreach遍历对象实现代码

    Xml中使用foreach遍历对象实现代码

    这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • RocketMq同组消费者如何自动设置InstanceName

    RocketMq同组消费者如何自动设置InstanceName

    这篇文章主要介绍了RocketMq同组消费者如何自动设置InstanceName问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java数组实例练习题整理

    Java数组实例练习题整理

    在本篇文章中小编给各位分享的是关于Java数组实例练习题以及相关代码整理,有需要的朋友们跟着学习下。
    2019-07-07
  • Java 实现并发的几种方式小结

    Java 实现并发的几种方式小结

    这篇文章主要介绍了Java 实现并发的几种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • spring初始化方法的执行顺序及其原理分析

    spring初始化方法的执行顺序及其原理分析

    这篇文章主要介绍了spring初始化方法的执行顺序及其原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java依赖混乱存在的问题与解决方案

    java依赖混乱存在的问题与解决方案

    这篇文章主要为大家介绍了java依赖混乱存在的问题与解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java职责链模式的深入了解

    Java职责链模式的深入了解

    这篇文章主要为大家介绍了Java职责链模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • SpringBoot生产环境打包如何去除无用依赖

    SpringBoot生产环境打包如何去除无用依赖

    这篇文章主要介绍了SpringBoot生产环境打包如何去除无用依赖问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot实现Mysql使用MD5进行密码加密的示例

    SpringBoot实现Mysql使用MD5进行密码加密的示例

    这篇文章主要介绍了SpringBoot实现Mysql使用MD5进行密码加密的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论