JMeter中列表含特殊字符致JSON Schema验证失败求助
解决方案:JMeter构造含特殊字符的JSON数组负载报错问题
问题根源
- BeanShell PreProcessor生成的
ArrayList直接调用toString()得到的是Java风格数组(如[带&的元素, 带空格的元素]),未对特殊字符做JSON转义,导致实际请求的JSON结构破坏。 - 服务端JSON Schema验证时,因非法JSON格式误判为“数组值不符合要求”(实际是JSON解析失败后结构异常)。
修复步骤
1. 替换BeanShell为JSR223 PreProcessor(Groovy脚本)
Groovy自带JSON安全转义能力,且性能远优于BeanShell,是JMeter官方推荐的脚本语言。
生成含特殊字符的字符串数组(适用于服务端期望字符串数组的场景)
// 读取groups CSV并生成标准JSON数组 def csvPath = "sampleGroups.csv" // 替换为你的CSV实际路径 def groupsList = [] new File(csvPath).eachLine { line -> // 转义JSON特殊字符:双引号、反斜杠、换行等 def escapedStr = line.replaceAll(/\\/, "\\\\\\\\").replaceAll(/"/, "\\\\\"") groupsList.add("\"${escapedStr}\"") // 为元素添加JSON字符串引号 } // 将数组转为标准JSON格式,存入JMeter变量 vars.put("groups", "[" + groupsList.join(",") + "]") // tags数组同理(如果需要保留原逻辑) def tagsPath = "sampleTags.csv" def tagsList = [] new File(tagsPath).eachLine { line -> def escapedStr = line.replaceAll(/\\/, "\\\\\\\\").replaceAll(/"/, "\\\\\"") tagsList.add("\"${escapedStr}\"") } vars.put("tags", "[" + tagsList.join(",") + "]")
生成对象数组(适用于服务端期望对象数组的场景,比如每个group是{"name": "xxx"})
如果服务端Schema要求included.groups是对象数组而非字符串数组,调整脚本如下(假设CSV每行是单个字段值,对应对象的name属性):
def csvPath = "sampleGroups.csv" def groupsList = [] new File(csvPath).eachLine { line -> def escapedName = line.replaceAll(/\\/, "\\\\\\\\").replaceAll(/"/, "\\\\\"") groupsList.add("{\"name\":\"${escapedName}\"}") } vars.put("groups", "[" + groupsList.join(",") + "]")
2. 保持HTTP请求负载不变
原负载的变量引用逻辑无需修改:
{ "included": { "groups": ${groups}, "tags": ${tags} } }
3. 验证请求格式
运行测试后,查看查看结果树中的请求内容,确认groups数组是标准JSON格式,比如:
{ "included": { "groups": ["group&name", "group/with/slash", "group with space"], "tags": ["tag1", "tag2"] } }
关键注意事项
- 必须确保HTTP请求的
Content-Type头设置为application/json,否则服务端可能无法正确解析负载。 - 保留原始CSV数据的前提下,Groovy脚本的转义逻辑会自动处理所有JSON特殊字符,无需手动修改CSV内容。
内容的提问来源于stack exchange,提问作者GorkhaliHero
相关产品推荐
相关产品推荐

