
本文介绍一种基于现代 javascript 特性(json.parse 第三参数)的安全、精准方案,用于从原始 json 字符串中识别未被引号包裹的 16 位及以上整数,并将其可靠转换为 bigint,同时自动规避字符串内数字、浮点数和科学计数法等误匹配场景。
本文介绍一种基于现代 javascript 特性(json.parse 第三参数)的安全、精准方案,用于从原始 json 字符串中识别未被引号包裹的 16 位及以上整数,并将其可靠转换为 bigint,同时自动规避字符串内数字、浮点数和科学计数法等误匹配场景。
在处理后端返回的 JSON 文本时,若需将超长整数(如 16 位以上 ID 或金额)准确转为 BigInt,直接使用正则表达式极易出错:它难以可靠区分 JSON 中的原始数字字面量(如 "BIG_INT": 123456789012345675)与字符串内的数字(如 "STRING_BIG_INT": "12345678901234567")、数组字符串(如 "STRING_BIG_INT_ARRAY": "[123...,123...]")或浮点数(如 12345678901234567.765...)。传统正则易漏匹配、误匹配,且无法感知 JSON 语法上下文。
推荐方案:利用 JSON.parse 的源文本访问能力(Stage 3 提案)
现代浏览器(Chrome/Edge ≥ v120)已支持 JSON.parse(text, reviver) 的 reviver 函数第三参数 info,其中 info.source 直接提供该值在原始字符串中的精确字面量(例如 "123456789012345675" 或 "12345678901234567.765...")。这使我们能完全规避正则解析 JSON 的固有缺陷:
function bigIntReviver(key, value, info) {
// 仅当 source 可用、value 是 number、且超出安全整数范围时才处理
const source = info?.source;
if (!source || typeof value !== 'number' ||
(Number.MIN_SAFE_INTEGER <p>✅ <strong>优势总结</strong>: </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8078" title="Wjs Uploading Video"><img
src="https://img.php.cn/upload/skill/000/000/081/179185692016044.jpg" alt="Wjs Uploading Video" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8078" title="Wjs Uploading Video" class="overflowclass">Wjs Uploading Video</a>
<p class="overflowclass">将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。</p>
</div>
<a rel="nofollow" href="/xiazai/skill8078" title="Wjs Uploading Video" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 100% 语义准确:依赖 JSON 解析器自身对 token 类型的判断,而非字符串模式匹配;
- 天然规避误匹配:字符串内数字("...")、数组字符串("[...]")因 value 类型为 string 被自动跳过;
- 精准处理浮点:通过 source.includes('.') 直接检测原始字面量是否含小数点;
- 兼容科学计数法:/e/i.test(source) 拦截 1e16 等格式;
- 零正则风险:无需维护复杂正则,避免边界 case(如换行、空格、嵌套结构)导致的匹配失效。
⚠️ 注意事项:
- 当前该特性尚未被 Firefox 全面支持(截至 2024),生产环境需做特性检测或降级处理(如回退到预处理字符串 + 安全正则的兜底方案);
- info.source 返回的是带原始空白和符号的字面量(如 " 123456789012345675 "),BigInt() 可直接处理;
- 若需兼容旧环境,可结合 JSON.stringify() 后正则替换(但需严格限定上下文,如确保匹配位于 : 后、} 或 , 前,且前后无双引号),但语义可靠性远低于本方案。
此方法代表了处理 JSON 中大整数问题的最佳实践——以标准解析器为基石,用最小侵入性实现最大准确性。










