
本文介绍一种基于现代 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 <= value && value <= Number.MAX_SAFE_INTEGER)) {
return value;
}
// 排除浮点数(含小数点)和科学计数法(含 e/E)
if (source.includes('.') || /e/i.test(source)) {
return value;
}
// 精确还原原始整数字面量并转为 BigInt
try {
return BigInt(source);
} catch {
return value; // 解析失败则保留原值
}
}
// 示例数据(注意:原始字符串中数字无引号)
const jsonStr = `{
"BIG_INT": 123456789012345675,
"BIG_INT_ARRAY_SINGLE": [123456789012345676],
"BIG_INT_ARRAY_MULTIPLE": [123456789012345661, 12345678901234562],
"STRING_BIG_INT_ARRAY": "[12345678901234567,12345678901234567]",
"STRING_BIG_INT": "12345678901234567",
"BIG_INT_FLOATING_DECIMAL": 12345678901234567.76543210987654321
}`;
const result = JSON.parse(jsonStr, bigIntReviver);
console.log(result.BIG_INT); // → 123456789012345675n
console.log(result.BIG_INT_ARRAY_MULTIPLE[1]); // → 12345678901234562n
console.log(typeof result.STRING_BIG_INT); // → "string"(未改动)
console.log(result.BIG_INT_FLOATING_DECIMAL); // → 12345678901234568(普通 number,非 BigInt)✅ 优势总结:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 100% 语义准确:依赖 JSON 解析器自身对 token 类型的判断,而非字符串模式匹配;
- 天然规避误匹配:字符串内数字("...")、数组字符串("[...]")因 value 类型为 string 被自动跳过;
- 精准处理浮点:通过 source.includes('.') 直接检测原始字面量是否含小数点;
- 兼容科学计数法:/e/i.test(source) 拦截 1e16 等格式;
- 零正则风险:无需维护复杂正则,避免边界 case(如换行、空格、嵌套结构)导致的匹配失效。
⚠️ 注意事项:
- 当前该特性尚未被 Firefox 全面支持(截至 2024),生产环境需做特性检测或降级处理(如回退到预处理字符串 + 安全正则的兜底方案);
- info.source 返回的是带原始空白和符号的字面量(如 " 123456789012345675 "),BigInt() 可直接处理;
- 若需兼容旧环境,可结合 JSON.stringify() 后正则替换(但需严格限定上下文,如确保匹配位于 : 后、} 或 , 前,且前后无双引号),但语义可靠性远低于本方案。
此方法代表了处理 JSON 中大整数问题的最佳实践——以标准解析器为基石,用最小侵入性实现最大准确性。

















