现象
用javascript把一个json字符串转换为JSON对象,代码:
var jsonStr = '{"id": 47854561584745547, "userId": 547885499847781512}';
var json = JSON.parse(jsonStr);
console.log(json);
运行结果如下:
具体原因:https://www.cnblogs.com/snandy/p/4943138.html
可以发现整数超过 9007199254740992 这个数就可能会丢失精度,解决方法就是将超过这个数字段的值转为字符串类型,为了方便处理16位及以上的整数全部转换为字符串类型。
解决方法
将16位及以上的整数装换为字符串类型,以免丢失精度
var jsonStr = '{"id": 47854561584745547, "userId": 547885499847781}';
// 长整型装换为字符串类型
jsonStr = jsonStr.replace(/"\w+":\s*\d{16,}/g, function(longVal){
let split = longVal.split(":");
return split[0] + ':' + '"' + split[1].trim() + '"';
});
var json = JSON.parse(jsonStr);
console.log(json);
运行结果如下:
我们可以看到17位的整数转成了字符串类型,没有超过16位的整数不做改动。
正则表达式:/"\w+":\s*\d{16,}/g
结语
如果系统中普遍存在长整型的问题,前端可通过全局请求拦截器处理响应的结果!