将JSON中的大数字解析为字符串[重复]

Posted

技术标签:

【中文标题】将JSON中的大数字解析为字符串[重复]【英文标题】:Parsing big numbers in JSON to strings [duplicate] 【发布时间】:2013-12-22 21:32:27 【问题描述】:

我正在尝试解决 JSON.parse() 舍入大数字的问题。我知道为什么会发生这种情况,但我正在寻找它周围的地方。

我在想一个可以解析 JSON 文本并将所有大整数转换为字符串的正则表达式。

我在 Windows 8 应用程序中使用 javascript,它必须由客户端处理。

到目前为止让我很难过。

主要问题是我必须在收到来自 XMLHTTPRequest 的响应后执行此操作,并且无法更改 JSON 的原始格式

例如

 "data" : 
    "username":"Brad", "userID":941022167561310208, "location":"London"
    

【问题讨论】:

你能改变json吗?在任何足够大的数字周围添加引号? 您能否提供一个您正在使用的 JSON 样本?它应该四舍五入到多少位(或根本不四舍五入)? 我知道这是理想的,但不幸的是不可能 无法包含您的 JSON 示例? 对不起,没有回应第一条评论。现在附上样本。 【参考方案1】:

我知道这是一个非常古老的问题,但如果您使用 npm,这是您可以使用的解决方案。 Javascript 可以处理值 9007199254740991 docs 的 bigInt。您可以使用this npm 包来解析包含大量数字的 JSON。

安装你的包

npm i json-bigint

然后像这样使用它。

var JSONbig = require('json-bigint');
let result = JSONbig.parse(<your-json>);

【讨论】:

如果你已经在使用 BigNumber.js 你可以使用这个 npm 包 json-bignumber:npmjs.com/package/json-bignumber【参考方案2】:

免责声明:

这是一个古老的答案,而且这个问题更古老。您不应该永远使用正则表达式解析 JSON - 它的解决方案太脆弱,并且容易随机中断。正确的做法是解析整个 JSON 字符串,然后使用代码将字符串值转换为数字,例如parseInt(jsonData.data.userID)

一个更好的方法是在你的后端修复它,这样你的客户就不必这样做了。


这是用引号包裹所有整数的正则表达式。如果您只想对长字符串执行此操作,请将 + 更改为 9,(或任何 int)。

var json = ('"data":"username":"Brad","userID":941022167561310208,"location":"London","test":"3908349804","test2":"This already exists in 034093049034 quotes","list":[3409823408,3409823408,"A list 234908234"]');
json = json.replace(/([\[:])?(\d+)([,\\]])/g, "$1\"$2\"$3");
json = JSON.parse(json);

查看示例:http://jsfiddle.net/remus/6YMYT/

编辑更新以适应列表。

下面是正则表达式:http://regex101.com/r/qJ3mD2

【讨论】:

完美,有什么方法可以做到这一点不会影响已经用引号括起来的数字吗? 再次更新,现在可以处理列表 解决了我 99% 的问题,我也在使用小数,所以我只需要添加到正则表达式的数字选择器部分。新的是:json = json.replace(/([\[:])?([\d\.]+)([,\\]])/g, "$1\"$2\"$3"); 嘿@JoshG 查看编辑。虽然这在技术上可行,但它真的很脆弱,我不能凭良心推荐它。 @brandonscript 我看到了,我只是想确保这是我们面临的问题,然后我想我会添加我发现的内容,虽然这不会出现太多我们会很可能是将后端更改为不传递原始数字,感谢您跟进智慧并维护您的答案!【参考方案3】:

如果您需要将其用作string,则只需将其保存为字符串,使用""

 "data" : 
    "username":"Brad", "userID":"941022167561310208", "location":"London"
    

你还有一个错误username => "username"

您也可以稍后使用parseInt() 将其解析为整数

对于更新的问题:那么您需要使用正则表达式将您的号码与"" 括起来:

s='"data":"username":"Brad","userID":9410221675613105435234324235235235235235523208,"location":"London"';
s = s.replace(new RegExp('"userID":([0-9]+),',"g"),'"userID":"$1",')

示例:http://jsfiddle.net/E4txx/

【讨论】:

以上是关于将JSON中的大数字解析为字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python人类可读的大数字[重复]

Javascript - 在默认解析之前将 EXTRA LARGE 数字转换为 JSON 中的字符串

解决后端返回数据中的大数字问题(使用第三方包json-bigint )

javascript中的大数字

c_cpp 除以表示为字符串的大数字

如何将从 json 接收到的 ko.observable 字符串解析为整数(数字)值