k6性能测试中JSON超长整数解析失真,求无需修改后端的解决方法
在k6中处理超出JavaScript安全整数范围的长整型ID问题
问题根源
后端返回的ID(2733382000000000049)远大于JavaScript的Number.MAX_SAFE_INTEGER(9007199254740991),使用response.json()解析时,JavaScript会自动将超出安全范围的整数转换为近似值,导致末尾精度丢失。另外你遇到的response.body()报错,是因为k6中response.body是属性而非方法,正确写法是response.body。
解决方法(无需修改后端)
方法1:使用第三方JSON解析器保留大整数
使用json-bigint库解析JSON,它会将大整数转为BigInt类型,避免精度丢失。
- 本地安装依赖:
npm install json-bigint
- 在k6脚本中使用:
import JSONbig from 'json-bigint'; export default function () { const res = http.get('目标请求URL'); const parsedData = JSONbig.parse(res.body); // 将BigInt转为字符串使用 const id = parsedData.item.id.toString(); console.log(id); // 输出原始值:2733382000000000049 }
方法2:手动修改响应体字符串(无依赖)
通过正则表达式将响应体中的目标大整数字段替换为字符串,再用原生JSON.parse解析:
export default function () { const res = http.get('目标请求URL'); // 正则匹配id字段后的大整数,替换为字符串形式 const modifiedBody = res.body.replace(/"id":(\d{17,})/, '"id":"$1"'); const parsedData = JSON.parse(modifiedBody); console.log(parsedData.item.id); // 输出字符串格式的原始ID }
注意:需根据实际响应格式调整正则表达式,确保仅匹配目标字段,避免误替换其他数字。
方法3:使用response.json()的reviver函数(局限性说明)
k6的response.json()支持传入reviver函数,但由于JavaScript解析前已丢失精度,此方法无法恢复原始末尾数字,仅作补充参考:
export default function () { const res = http.get('目标请求URL'); const parsedData = res.json((key, value) => { if (typeof value === 'number' && !Number.isSafeInteger(value)) { return value.toString(); } return value; }); // 注意:此处输出的是丢失精度后的字符串(2733382000000000000),无法恢复原始值 console.log(parsedData.item.id); }
内容的提问来源于stack exchange,提问作者Artur Korobeynyk
相关产品推荐
相关产品推荐

