将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中的大数字解析为字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Javascript - 在默认解析之前将 EXTRA LARGE 数字转换为 JSON 中的字符串