当前位置: 首页 > article >正文

Spring Boot中接口数据字段为 Long 类型时,前端number精度丢失问题解决方案

Spring Boot中接口数据字段为 Long 类型时,前端number精度丢失问题解决方案

在Spring Boot中,当接口数据字段为 Long 类型时,返回页面的JSON中该字段通常会被序列化为数字类型。

例如,一个Java对象中有一个 Long 类型的属性 id ,值为 1234567890123L ,在返回的JSON中会表示为 {"id":1234567890123} 。

不过,JavaScript中 Number 类型的安全整数范围是 -2^53 到 2^53 ,如果 Long 类型的值超出这个范围,在前端JavaScript处理时可能会出现精度丢失问题。为避免该问题,可以在将 Long 类型数据返回给前端时,将其转换为 String 类型。可以使用 Jackson 的 @JsonSerialize 注解来实现,示例代码如下:

java

import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

public class MyObject {

@JsonSerialize(using = ToStringSerializer.class)
private Long id;

// 省略其他属性和方法

}   这样,在返回JSON时, id 字段就会被序列化为字符串类型,能有效避免前端的精度丢失问题。

在Spring Boot中,可以通过配置 Jackson 来全局设置 Long 类型字段在返回JSON时序列化为字符串类型。 以下是两种常见的方法:

1.通过配置类 创建一个 Jackson 的配置类,在类中定义一个 Bean 来配置 ObjectMapper 。示例代码如下:

java

import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;

@Configuration public class JacksonConfig {

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    // 将Long类型序列化为字符串
    module.addSerializer(Long.class, ToStringSerializer.instance);
    // 处理Long类型的数组或集合
    module.addSerializer(Long[].class, new ToStringSerializer(false));
    objectMapper.registerModule(module);
    return objectMapper;
}

}  

2.通过应用配置文件 在 application.properties 或 application.yml 文件中添加配置,告诉 Jackson 将 Long 类型序列化为字符串。示例如下:

yaml

spring: jackson: serialization: WRITE_NUMBERS_AS_STRINGS: true  

上述两种方法都可以实现将 Long 类型字段全局序列化为字符串类型,你可以根据项目的实际情况选择合适的方式。


http://www.kler.cn/a/600265.html

相关文章:

  • Flask接口开发--GET接口
  • 不能解析域名怎么回事?
  • Linux paste命令
  • 鸿蒙开发之背景图片的使用
  • CentOS 7 64位安装Docker
  • vue3父子组件传值
  • JavaScript 事件循环
  • JVM中的运行时常量池详解
  • 【QA】Qt有哪些迭代器模式的应用?
  • Vue中的状态管理器Vuex被Pinia所替代-上手使用指南
  • 买卖股票的最佳时机(js实现,LeetCode:121)
  • 【Excel使用技巧】某列保留固定字段或内容
  • 多语言语料库万卷·丝路2.0开源,数据模态全面升级,搭建文化交流互鉴AI桥梁
  • 原子化 CSS
  • 护网面试题总结
  • Java 集合 List、Set、Map 区别与应用
  • 基于Spring Boot + Vue的银行管理系统设计与实现
  • XDP/eBPF来包过滤-已上机验证
  • CSS实现当鼠标悬停在一个元素上时,另一个元素的样式发生变化的效果
  • 《AI Agent智能应用从0到1定制开发》学习笔记:使用RAG技术增强大模型能力,实现与各种文档的对话