为什么使用json.parse解析字符串后,数字会改变?

3
let string = `{"access_token": "someThingsHere", "user_id": 17841436766171705}`;

let resultObject = JSON.parse(string);

console.log(resultObject);

输出:

{access_token: "someThingsHere", user_id: 17841436766171704};

'user_id'被更改了。但为什么?请帮我描述一下。


2
IEEE-754双精度浮点数仅具有约17个相对精度数字。对于整数而言,这是一个具有正限制的不同范围,其正限制约为2^53,小于本机int64(2^64)类型。理想情况下,源代码应使用OPAQUE STRING而不是数字。最多可以使用int32。 - user2864740
https://dev59.com/MmYr5IYBdhLWcg3wpb2Q#13502497 — 在 JSON 中,并没有“强制”指定限制,但是将整数保持为 int32 将避免 JSON <-> JS 转换问题,例如遇到的那个问题。一些提供程序(如 Json.NET)可以很好地处理 int64。 (很少有语言支持 int53 作为离散限制,因此这种情况不太重要。) - user2864740
2个回答

2

可能是因为该值对于JSON.parse()来说过高了,可以查看这个线程


谢谢您的回复。请告诉我如何解决这个问题? - Masum Billah
@MasumBillah,正如一些人已经建议的那样,您可以将user_id视为字符串,以便能够正确解析它。我假设您不会对其进行算术运算,因此这不会对您的应用程序造成任何修改。 - sromeu
@sromeu您的建议非常好。我认为这只是一个字符串,然后解决了它。 - Masum Billah

-2
问题在于您的 ID 高于 InfinityNumber.MAX_SAFE_INTEGER,导致 Javascript 溢出该数字。
好消息是输入具有字符串类型,因此我们可以使用正则表达式直接操作它。我们只需要在数字周围添加引号,这样 JSON.parse 就会将其解释为字符串。

let string = `{"access_token": "someThingsHere", "user_id": 17841436766171705}`;
string = string.replace(/("user_id":\s?)([\d]*)/, '$1"$2"');

let resultObject = JSON.parse(string);
console.log(resultObject);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接