json fetch()响应截断大数字

carvr3hs  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(108)

我已经设置了fetch()来使用他们的API从GotoWebinar中检索历史网络研讨会的详细信息。它返回一个JSON主体,包含以下结构,一个对象数组:
[{“webinarKey”:5653814518315977731,“webinarID”:“562189251”,“subject”:“样本网络研讨会”,“organizerKey”:1000000000331530},{“webinarKey”:9999814518315977731,“webinarID”:“99989251”,“subject”:“样本网络研讨会”,“organizerKey”:99900000003331530}]
我的代码正在Zapier操作(节点)中嵌入。js),重要的部分看起来像这样:

//Handle errors from fetch call
function handleFetchStatus(response){
    console.log('Fetch Response Status: ' + response.status);

    switch(response.status){
        case 200: //Request executed properly
            break;

        default:
            throw Error(response.status + ':' + JSON.stringify(response));
    }

    return response.json();

}

function handleFetchBody(oResponse){
    if (oResponse) {
        console.log('handleFetchBody: ' + JSON.stringify(oResponse));
    }

    callback(null, oResponse);
}

//Send POST request.
fetch(getFetchURL(), getFetchOptions())
    .then(handleFetchStatus)
    .then(handleFetchBody)
    .catch(function(error) {
        callback(error);
    });

我遇到的问题是'webinarKey',一个很长的数字,正在从“5653814518315977731”截断为“5653814518315978000”。我认为是json()函数没有处理大的数字。
我怎么才能阻止这一切
我认为在使用json()之前需要将webinarKey转换为字符串,但我不确定如何访问对象的所有元素。这在fetch响应中是可能的。

sigwle7e

sigwle7e1#

它与JavaScript中精度的位数有关。在JavaScript中,所有数字都存储为浮点数,这就像以2为基数而不是以10为基数的科学记数法。在a * (2 ** b)中,有固定数量的位(在本例中为53位)可用于表示a。如果你看一下Number.MAX_SAFE_INTEGER,可以用53位精度表示的最大整数,你会看到它有16个以10为底的数字。你的号码是19.如果您只是在JavaScript控制台中输入数字,您将看到它打印出四舍五入的版本(精度为16位)。如果需要存储这么大的数字,通常最好将它们存储为字符串。

z9ju0rcb

z9ju0rcb2#

这个问题很老了,但是当我搜索这个问题时出现了,所以我想我应该在这里留下答案。我也遇到了类似的问题(外部API我无法控制返回非常大的整数值作为ID),这些值被json.parse截断。我最终使用这个lossless-json NPM package来解决一个定制的数字解析器的问题,该解析器将大整数值转换为字符串。这对我来说已经足够了,因为我只需要引用作为ID。

customNumberParser(value: any) {
  if (value.isLosslessNumber) {
    return value.toString();
  }
  return value;
}

相关问题