long类型前端丢失精度问题
背景
long 类型传到前端后,会因为丢失精度,自动转00;比如雪花id
原因:
Java中Long的取值范围为-9223372036854775808到9223372036854775807(即-2^64“ 到”2^64-1)
JavaScript中的Number取值范围为-9007199254740992 到9007199254740991 (即-2^53 到2^53-1)
解决方法:
-
查看序列方式
-
根据序列化的方式,选择不同的注解
fastjson:@JSONField(serializeUsing = ToStringSerializer.class)
jackson:@JsonFormat(shape = JsonFormat.Shape.STRING)
@JSONField(serializeUsing = ToStringSerializer.class) 不生效
原因:
SpringBoot2.0.5版本中使用的默认序列化方式为jackson,而不是fastjson
解决方法:
jackson:@JsonFormat(shape = JsonFormat.Shape.STRING)
排查过程:
- 查看 pom 中 spring-boot-starter-web ,不断点进去,发现使用的是 spring-boot-starter-json
- 再点进去,发现引用的是 jackson,所以用 jackson 的注解