【问题标题】:Why json number changed, when do json.parse a string? [duplicate]为什么 json 编号改变了,什么时候 json.parse 一个字符串? [复制]
【发布时间】:2020-11-28 10:36:35
【问题描述】:
let string = `{"access_token": "someThingsHere", "user_id": 17841436766171705}`;

let resultObject = JSON.parse(string);

console.log(resultObject);

输出:

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

这里的“user_id”已更改。但为什么?请帮我描述一下。

【问题讨论】:

  • IEEE-754 double-64 只有~17 位相对精度。对于 INTEGERS,这是一个明显的范围,其正限制为 ~2^53,小于原生 int64 (2^64) 类型。理想情况下,源将使用不透明字符串而不是数字。到 int32 就可以了。
  • stackoverflow.com/a/13502497/2864740 — 在 JSON 中没有“强烈”指定限制,尽管将整数保持为 int32 将避免 JSON JS 转换问题,例如遇到的问题。像 Json.NET 之类的一些提供程序可以在 int64 上正常工作。 (很少有语言支持将 int53 作为离散限制,因此这不是一个有趣的断点。)

标签: javascript json string


【解决方案1】:

问题是您的 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);

【讨论】:

    【解决方案2】:

    可能是因为JSON.parse()的值太高了,看看这个thread

    【讨论】:

    • 感谢您的回复。请问怎么解决?
    • @MasumBillah 正如一些人已经建议的那样,您可以将 user_id 视为字符串,这样您就可以正确解析它。我假设你不会用它进行算术运算,所以它根本不会修改你的应用程序。
    • @sromeu 你的好建议。我认为它只是一个字符串,然后解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2015-08-17
    • 2013-02-13
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多