diff --git a/utils/api.js b/utils/api.js index 16f6d90..d1a079d 100644 --- a/utils/api.js +++ b/utils/api.js @@ -362,48 +362,15 @@ export { buildFormBodyWithImages } /** * 安全解析 JSON,将超出 JS 安全整数范围的数字转为字符串 - * uni.request 可能会自动解析 JSON,所以返回的数据可能是对象或字符串 + * 必须用正则提前处理原始文本,因为 JS 的 JSON.parse 在数字解析阶段 + * 就已经丢失精度了,reviver 回调拿到的也是错误值 */ -function safeJsonParse(data) { - if (typeof data === 'string') { - return JSON.parse(data, function(key, value) { - if (typeof value === 'number' && !Number.isSafeInteger(value)) { - return String(value) - } - return value - }) - } - // data 已经是对象(uni-app 自动解析了),修复所有大整数字段 - if (data && typeof data === 'object') { - fixLargeInts(data) - } - return data -} - -/** - * 递归修复对象中的大整数(超过 JS 安全范围的 number → string) - */ -function fixLargeInts(obj) { - if (obj === null || obj === undefined) return - if (typeof obj !== 'object') return - - if (Array.isArray(obj)) { - for (var i = 0; i < obj.length; i++) { - if (obj[i] !== null && obj[i] !== undefined && typeof obj[i] === 'object') { - fixLargeInts(obj[i]) - } - } - return - } - - for (var key in obj) { - var val = obj[key] - if (typeof val === 'number' && !Number.isSafeInteger(val)) { - obj[key] = String(val) - } else if (val !== null && typeof val === 'object') { - fixLargeInts(val) - } - } +function safeJsonParse(text) { + if (typeof text !== 'string') return text + // 把所有 16 位及以上数字(JSON value 位置)用引号包起来 + // 这样 JSON.parse 会当字符串处理,不会丢精度 + text = text.replace(/:\s*(-?\d{16,})\s*([,}\]])/g, ':"$1"$2') + return JSON.parse(text) } /** @@ -418,6 +385,7 @@ export function getShopList(params = {}) { uni.request({ url: url, method: 'GET', + dataType: 'text', header: { 'Authorization': 'Bearer ' + token }, @@ -451,6 +419,7 @@ export function getShopDetail(params = {}) { uni.request({ url: url, method: 'GET', + dataType: 'text', header: { 'Authorization': 'Bearer ' + token },