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 对上了

总结

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

相关文章

  • 深度解析Java常量池中的Integer缓冲池和String常量池

    深度解析Java常量池中的Integer缓冲池和String常量池

    为了减少对象重复创建、提升运行时效率,Java 内部提供了两种重要的优化机制Integer 缓冲池(IntegerCache)和 String 常量池(String Pool),本文将深入剖析两大常量池的底层实现、工作流程、适用范围,并通过流程图和代码示例帮助你彻底掌握
    2026-05-05
  • Java基础详解之面向对象的那些事儿

    Java基础详解之面向对象的那些事儿

    这篇文章主要介绍了Java基础之面向对象那些事儿,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • SpringBoot+Vue3实现七牛云大视频上传

    SpringBoot+Vue3实现七牛云大视频上传

    现代Web应用中文件上传很重要,本文用Vue.js和Spring Boot实现视频上传功能,同时使用七牛云作为存储服务,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 详解Java Web如何限制访问的IP的两种方法

    详解Java Web如何限制访问的IP的两种方法

    这篇文章主要介绍了详解Java Web如何限制访问的IP的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • SpringMVC使用注解配置方式

    SpringMVC使用注解配置方式

    这篇文章主要为大家介绍了SpringMVC使用注解配置方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • java中实现对象排序的两种方法(Comparable,Comparator)

    java中实现对象排序的两种方法(Comparable,Comparator)

    这篇文章主要给大家介绍了关于java中实现对象排序的两种方法,一种是实现Comparable进行排序,另一种是实现Comparator进行排序,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Java多线程的用法详解

    Java多线程的用法详解

    本篇文章介绍了,在Java中多线程的用法详解。需要的朋友参考下
    2013-04-04
  • mybatis如何封装List<String>类型属性

    mybatis如何封装List<String>类型属性

    这篇文章主要介绍了mybatis如何封装List<String>类型属性问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringMVC异常处理知识点总结

    SpringMVC异常处理知识点总结

    在本篇文章里小编给大家整理的是关于SpringMVC异常处理相关知识点内容,需要的朋友们学习下。
    2019-10-10
  • SpringBoot如何接收前端传递参数

    SpringBoot如何接收前端传递参数

    这篇文章主要介绍了SpringBoot如何接收前端传递参数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08

最新评论