Long类型在前端丢失精度
本文共 2,439 字,预计阅读时间 8 分钟
1.问题描述
对表的主键使用的是雪花策略生成的id,在java中的Long类型的,但在前端精度丢失,现象如下:
{ "id": 1297373218628307972 }
上面假如是后端使用jackson传递给前端的,前端接收的id的值却变成了1297373218628307000。
原因是JavaScript对long类型的解析最多是17位。
2.解决方案
解决办法就是后端把Long类型转换成字符串类型传递给前端,而前端传递给后端后再转换成Long类型去对应数据库。
1)新建类,把Long类型转换成字符串类型
package com.zxh.configure; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** * Long 类型字段序列化时转为字符串,避免js丢失精度 */ public class LongJsonSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException { String text = (value == null ? null : String.valueOf(value)); if (text != null) { jsonGenerator.writeString(text); } } }
2)新建类,把字符串类型转换成Long类型
package com.zxh.configure; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import lombok.extern.slf4j.Slf4j; import java.io.IOException; /** * 字符串转为Long */ @Slf4j public class LongJsonDeserializer extends JsonDeserializer<Long> { @Override public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException { String value = jsonParser.getText(); try { return value == null ? null : Long.parseLong(value); } catch (NumberFormatException e) { log.error("解析长整形错误", e); return null; } } }
3)在Long类型的字段上添加注解
package com.zxh.entity; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.ljxx.configure.LongJsonDeserializer; import com.ljxx.configure.LongJsonSerializer; import lombok.Data; import lombok.experimental.Accessors; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; import java.util.Date; @Data @Accessors(chain = true) public class User implements Serializable { @JsonSerialize(using = LongJsonSerializer.class) @JsonDeserialize(using = LongJsonDeserializer.class) private Long userId; //其他属性略 }
这样可以完美解决。
就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!