const jsonStr = `{"myBigInt":6028792033986383748, "someStr":"hello guys", "someNumber":123}`
const result = JSON.parse(jsonStr, (key, value) => {
if (typeof value === 'number' && !Number.isSafeInteger(value)) {
let strBig = jsonStr.match(new RegExp(`(?:"${key}":)(.*?)(?:,)`))[1] // get the original value using regex expression
return strBig //should be BigInt(strBig) - BigInt function is not working in this snippet
}
return value
})
console.log({
"original": JSON.parse(jsonStr),
"handled": result
})
5条答案
按热度按时间63lcw9qa1#
内置的JSON. parse不能。你需要手动解析它,并将值视为字符串(如果你想用它们做算术,有bignumber.js)你可以使用道格拉斯Crockford JSON.js库作为你的解析器的基础。
EDIT 2(原始答案7年后)- * 可能很快就可以使用标准JSON API解决这个问题。看看这个TC 39提案,将访问源字符串添加到reviver函数-https://github.com/tc39/proposal-json-parse-with-source *
编辑1:我为你创建了一个package:)
输出:
u4vypkhs2#
在搜索了一些更干净的东西-并且只找到像jsonbigint这样的库之后,我只是写了我自己的解决方案。不是最好的,但它解决了我的问题。对于那些使用Axios的人,你可以在transformResponse回调上使用它(这是我最初的问题- Axios解析JSON,所有的bigInt都是错误的),
3gtaxfhh3#
你可以试试我的库,它可以解决这个问题:https://www.npmjs.com/package/json-with-bigint
示例:
它支持往返操作,因此您可以安全地
stringify
和解析BigInt
值,而不会丢失任何内容。它与原生
JSON.parse
/JSON.stringify
的工作原理相同,除了BigInt
之外。xbp102n04#
正则表达式很难在所有情况下都正确。
这是我的尝试,但我给你的只是一些额外的测试用例,而不是解决方案。可能你会想替换一个非常特定的属性,和一个更通用的JSON解析器(处理分离属性,但将数字属性保留为字符串),然后你可以在继续解析成JavaScript对象之前将特定的长数字用引号括起来。
bttbmeg05#
你可以用这段代码把大数字转换成字符串,然后再用BigInt(data.value)