You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter响应含字节顺序标记(BOM)无法提取JSON问题求助

问题根因
  • 你代码中定义的BOM = ""是UTF-8 BOM字节序列被错误使用ISO-8859-1编码解码得到的乱码文本,不是BOM对应的实际Unicode字符,所以匹配逻辑完全失效
  • 匹配失败后BOM字符没有被删除,后续将字符串转UTF-8字节时相当于对原有乱码做了二次编码,才会出现»¿这类新的乱码
正确处理方案

推荐优先使用字节流操作,完全规避编码解码带来的匹配偏差,在JMeter的JSR223后置处理器中(语言选择Groovy)运行以下脚本即可:

// 直接读取原始响应字节,避免编码转换导致的偏差
byte[] responseBytes = prev.getResponseData()
// UTF-8 BOM对应的固定字节序列为 EF BB BF
byte[] bomBytes = [(byte)0xEF, (byte)0xBB, (byte)0xBF]

// 检查响应开头是否匹配BOM
if (responseBytes.length >= 3 
    && responseBytes[0] == bomBytes[0] 
    && responseBytes[1] == bomBytes[1] 
    && responseBytes[2] == bomBytes[2]) {
    // 截取BOM之后的有效字节
    byte[] noBomBytes = new byte[responseBytes.length - 3]
    System.arraycopy(responseBytes, 3, noBomBytes, 0, noBomBytes.length)
    // 替换原响应数据
    prev.setResponseData(noBomBytes)
}
// 显式指定响应编码为UTF-8,避免后续解析乱码
prev.setResponseEncoding("UTF-8")

如果更习惯用字符串处理,也可以使用BOM对应的原生Unicode字符匹配,代码如下:

def responseStr = prev.getResponseDataAsString()
// UTF-8 BOM对应的Unicode字符为 \uFEFF
if (responseStr.startsWith('\uFEFF')) {
    responseStr = responseStr.substring(1)
}
prev.setResponseData(responseStr.getBytes('UTF-8'))
prev.setResponseEncoding('UTF-8')

脚本执行完成后,后续的JSON提取器就可以正常识别响应内容,不需要做额外调整。

内容的提问来源于stack exchange,提问作者Gökhan Uçar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 16:30:00