Node.js读取JSON文件BigInt字段报类型转换错误的解决方法
报错原因
JSON.parse的reviver回调会按从内到外的顺序遍历解析生成的所有节点值:最先遍历到最内层的基础类型值,之后会遍历组装完成的对象、数组,最后还会遍历到最外层的根节点。
你写的reviver没有做任何类型判断,对所有传入的值都直接调用BigInt()做转换:当遍历到对象/数组类型的值时,BigInt()无法将对象类型转为大整数,就会抛出Cannot convert [object Object] to a BigInt的错误。
修正方案
在reviver回调中增加类型判断,仅对数字类型的值执行BigInt转换,对象、数组等其他类型的值直接原样返回即可。
修正后的完整代码:
const fs = require("fs"); function reviver(key, value) { if (typeof value === "number") { return BigInt(value); } return value; } let rawdata = fs.readFileSync("input.json"); let numbers = JSON.parse(rawdata, reviver); console.log(numbers);
执行node div.js即可得到正确输出:
[ { number: 19819n, divisor: 34n }, { number: 888n, divisor: 19n }, { number: 55555n, divisor: 126n } ]
注意:如果你的JSON中存在超过JS安全整数范围(2^53-1)的超大数字,上述方案会有精度损失——因为JSON.parse默认将数字解析为Number类型时就已经丢失精度,这类场景需要先对JSON原始文本做正则匹配处理,再做解析转换。你当前测试用例中的数字都在安全整数范围内,上述方案可以正常工作。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

