碰到问题:

    axios在处理服务器特大数据时如:

"id": 1323890743432970240

json字符串时默认使用的是JSON.parse()api进行对象转换 ,但问题出现了JavaScript只能精确保存安全数字内的数组 即:-2^532^53 内的整数数据,当转换后这个数字就发生了改变,如图

       这是直接在浏览器console面板输入的值,发现无法精确保存这种数字,也就是用这个id获取后台数据时会发生错误,经常报404,不改的话显向就是随机的正确性,偶然保存正确,这很明显不是我们想要的效果。

解决的原理

        通过算法将这种大数字转换为字符串或者是对象都写就是不能是数字,并且不可以绕过这种规则

使用第三方的包解决:

        json-bigint

官方示例:

输入:

var JSONbig = require('json-bigint');

var json = '{ "value" : 9223372036854775807, "v2": 123 }';
console.log('Input:', json);
console.log('');

console.log('node.js built-in JSON:');
var r = JSON.parse(json);
console.log('JSON.parse(input).value : ', r.value.toString());
console.log('JSON.stringify(JSON.parse(input)):', JSON.stringify(r));

console.log('\n\nbig number JSON:');
var r1 = JSONbig.parse(json);
console.log('JSONbig.parse(input).value : ', r1.value.toString());
console.log('JSONbig.stringify(JSONbig.parse(input)):', JSONbig.stringify(r1));

 输出:

Input: { "value" : 9223372036854775807, "v2": 123 }

node.js built-in JSON:
JSON.parse(input).value :  9223372036854776000
JSON.stringify(JSON.parse(input)): {"value":9223372036854776000,"v2":123}


big number JSON:
JSONbig.parse(input).value :  9223372036854775807
JSONbig.stringify(JSONbig.parse(input)): {"value":9223372036854775807,"v2":123}

但是使用时不能用它来计算,依旧是JavaScript无法精确保存这种大数据,其他方面都挺好用的,解决开头说的问题只需要在axios中配置一下就行,用到了transformResponse这个配置属性:

import JSONBig from 'json-bigint'

const res = axios.create({
  // 接口的基础连接
  baseURL: 'http:// www.xxxxx.com/',
  // 自定义返回的元素数据,axios会默认用JSON.parse
  // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
  transformResponse: [
    function (data) {
      // 对 data 进行任意转换处理
      try {
        return JSONBig.parse(data)
      } catch (err) {
        return data
      }
    }
  ]
})

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐