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

解决Long类型前端精度丢失和正常传回后端问题

在 Java 后端开发中,可能会遇到前后端交互过程中 Long 类型精度丢失的问题。尤其是在 JavaScript 中,由于其 Number 类型是双精度浮点数,超过 16 位的 Long 类型值就会发生精度丢失。

问题背景

假设有如下实体类:

public class TemplateValue implements Serializable {
    private Long colHeadId;
    private Long rowHeadId;
    private String val1;
    private String val2;
}

这在后端没有问题,但如果前端直接接收这个数据,colHeadId rowHeadId 可能会在 JS 中出现精度问题,比如:

{
  "colHeadId": 1234567890123456789
}
1234567890123456770  // 精度丢失!

解决方案:Long 类型转 String 传给前端

为了解决这个问题,我们需要在序列化时将 Long 类型转成 String,即使用:

@JsonSerialize(using = ToStringSerializer.class)

同时,前端传来的 String 要转回 Long 怎么办?

这就是本文的重点!序列化做了,反序列化没做,就会出现类型转换失败或数据无法接收的问题。

那么我们需要自定义一个反序列化器,将前端传来的 String 自动转成 Long 类型。

实现步骤

1.创建自定义反序列化器 ToLongDeserializer

可以放在工具类里

package com.yourproject.util;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;

public class ToLongDeserializer extends JsonDeserializer<Long> {
    @Override
    public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getText();
        try {
            return value != null ? Long.parseLong(value) : null;
        } catch (NumberFormatException e) {
            throw new IOException("Invalid long value: " + value, e);
        }
    }
}

2. 在实体类上使用序列化 & 反序列化注解
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yourproject.util.ToLongDeserializer;

public class TemplateValue implements Serializable {
    @JsonSerialize(using = ToStringSerializer.class)
    @JsonDeserialize(using = ToLongDeserializer.class)
    private Long colHeadId;

    @JsonSerialize(using = ToStringSerializer.class)
    @JsonDeserialize(using = ToLongDeserializer.class)
    private Long rowHeadId;

    private String val1;
    private String val2;
}

这样,在前后端交互时就能做到:

  • 后端返回数据时将 Long -> String,避免精度丢失;

  • 后端接收前端数据时将 String -> Long,方便业务逻辑处理。

总结

前后端交互中,涉及 Long 类型字段时:

  • 必须序列化为 String,@JsonSerialize(using = ToStringSerializer.class),避免前端精度丢失

  • 如果需要将数据回传给后端,必须反序列化为 Long,创建自定义反序列化器,确保后端能正常接收

相关文章:

  • 北大:检索增强LLM推理建模
  • Ubuntu 64-bit 交叉编译 FFmpeg(高级用户指南)
  • 2025AIGC终极形态:多模态(文本/图像/音乐/视频)系统整合
  • 开源软件与自由软件:一场理念与实践的交锋
  • 2024 天梯赛——工业园区建设题解
  • CF2075D Equalization
  • 代码随想录算法训练营Day21
  • Py一阶段习题汇总
  • 微型导轨的制造工艺中,热处理的目的是什么?
  • 202521 | 远程调用 | 注册中心
  • Go语言-初学者日记(六) 并发编程
  • Nginx-keepalived-高可用
  • cpp经典数论问题
  • celsius与Fahrenheit
  • C++ STL 详解 ——list 的深度解析与实践指南
  • leetcode120.三角形最小路径
  • 小刚说C语言刷题——第16讲 switch语句
  • C++11详解
  • Spring Boot 与 TDengine 的深度集成实践(三)
  • 利用C++编写操作OpenCV常用操作
  • 静态网站开发实验报告/24小时免费看的视频哔哩哔哩
  • 深圳科源建设集团有限公司网站/seo关键词排名优化软件
  • wordpress 微博模板/郑州seo网站有优化
  • php如何自学做网站/企业推广软文
  • 域名和网站一样吗/百度排名推广
  • 三网合一网站/手机网站建设平台