2017-08-17 84 views
0

我有fetch()设置从GotoWebinar使用它们的API检索历史网络研讨会详细信息。它返回一个JSON体具有这种结构,对象的数组:fetch()响应截断大数字

[{ “webinarKey”:5653814518315977731, “webinarID”: “562189251”, “受试者”: “样品网络研讨会”, “organizerKey” :100000000000331530 }, { “webinarKey”:9999814518315977731, “webinarID”: “999989251”, “受试者”: “样品网络研讨会”, “organizerKey”:999900000000331530 }]

我的代码是在Zapier动作(node.js)和重要位l中实施ooks这样的:

//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变成字符串,但我不确定如何访问该对象的所有元素。甚至可能在提取响应中。

回答

1

它与JavaScript中的精度位数有关。在JavaScript中,所有数字都以浮点形式存储,这与基数2中的科学表示法相似,而不是基数10.有固定数量的位(此例中为53)可用于表示aa * (2 ** b)。如果您查看Number.MAX_SAFE_INTEGER,可以用53位精度表示的最大整数,您将看到它具有16个基数为10的数字。您的电话号码为19.如果您只是在JavaScript控制台中键入号码,您将看到它打印出四舍五入的版本(具有16位精度)。如果您需要存储如此大的数字,通常最好将它们存储为字符串。

+0

据我所知,我不能存储一个很大的数字,它需要转换为一个字符串。但是API调用返回一个我无法控制的格式的响应主体。那么如何访问响应主体的元素,以便在将它传递给.json()之前将它们转换为字符串? –

+0

如果您将响应解析为文本('response.text()'而不是'response.json()'),则可以调用'text.replace(/(“[^”] *“\ s *:\ s *)(\ d {16,})/ g,'$ 1'$ 2'')'用字符串替换所有16位或16位以上的字符串,然后您可以将此文本传递给'JSON.parse()' – csander

+0

,那就是诀窍,我希望不要做字符串解析,但它似乎是唯一的方法。 –