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
相关产品推荐
相关产品推荐

