Bug现场:
在后端传Long类型订单号数据给前端时,出现了精度丢失问题, 如下
后端控制台:
前端浏览器:
原因:
js获得后端返回long类型时,会存在数据丢失的问题
JS内置有32位整数,而number类型的安全整数是53位。如果超过53位,则精度会丢失。正如现在后台传来一个64位的Long型整数,因此超过了53位,所以后台返回的值和前台获取的值会不一样。
解决:
方案1:
将sn存放到BaseResult前,转换成字符串 (加+""即可解决)
方案2:
可以在返回的对象中的Long类型字段添加:@JsonSerialize(using=ToStringSerializer.class)
fastjson在com.alibaba.fastjson.serializer包下面提供了多种数据类型转换的注解。
可以通过实现ObjectSerializer接口, 拓展这些注解,
json转换需要使用fastjson转换
ToStringSerializer的代码:
public class ToStringSerializer implements ObjectSerializer {
public static final ToStringSerializer instance = new ToStringSerializer();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
String strVal = object.toString();
out.writeString(strVal);
}
}
方案3:
此方案使用的是配置mvc的方式, 配置的地方是在当前的Controller层下面创建converter包
package converter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
public class LongToStringJsonConverter extends ObjectMapper {
public LongToStringJsonConverter() {
super();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
registerModule(simpleModule);
}
}
配置文件:
application/json;charset=UTF-8
text/plain;charset=UTF-8
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 !加油 ,陌生人一起努力,共勉!!