JMeter:如何修改Groovy代码为生成的JSON添加meta对象?
问题:在JMeter中用Groovy生成包含books数组和meta对象的JSON
此前通过Groovy在JMeter中动态生成JSON数组的方案效果良好,但现在需要在生成的JSON的books数组后添加一个meta对象,不清楚如何在toPrettyString格式化的结果中插入该对象。目标JSON示例如下:
{ "books": [ { "publisher": ${publisherName}, // 该变量在本次请求中所有项保持一致 "ISBN": ${isbn_1}, // 以下三个字段来自三个不同的数组 "Price": ${price_1}, "Publisher": ${publisher_1}, "Static Value that doesn't change": 100 }, { "publisher": ${publisherName}, // 该变量在本次请求中所有项保持一致 "ISBN": ${isbn_2}, // 以下三个字段来自三个不同的数组 "Price": ${price_2}, "Publisher": ${publisher_2}, "Static Value that will be the same for all items": 100 } ], "meta": { "tag": { "searchNumber": ${searchNo} } } }
此前使用的JSR223 Preprocessor代码如下:
def arraySize = vars.entrySet().findAll { entry -> entry.getKey().startsWith('isbn_') }.size() def books = [] 1.upto(arraySize, {index -> books.add([publisher:vars.get('publisherName'), ISBN: vars.get('isbn_' + index), Price: vars.get('price_' + index), Publisher:vars.get('publisher_' + index), "Static Value that doesn't change": 100 ]) }) log.info(new groovy.json.JsonBuilder([books:books]).toPrettyString())
解决方案
直接在构建最外层JSON结构时,同时包含books和meta两个字段即可,JsonBuilder会自动处理整个结构的格式化,无需单独插入对象。修改后的完整代码如下:
def arraySize = vars.entrySet().findAll { entry -> entry.getKey().startsWith('isbn_') }.size() def books = [] 1.upto(arraySize, {index -> books.add([publisher:vars.get('publisherName'), ISBN: vars.get('isbn_' + index), Price: vars.get('price_' + index), Publisher:vars.get('publisher_' + index), "Static Value that doesn't change": 100 ]) }) // 构建包含books数组和meta对象的完整JSON结构 def fullJson = new groovy.json.JsonBuilder([ books: books, meta: [ tag: [ searchNumber: vars.get('searchNo') ] ] ]).toPrettyString() log.info(fullJson) // 如果需要将结果保存为JMeter变量供后续使用,可添加以下代码: // vars.put('generatedJson', fullJson)
关键修改说明:
- 在
JsonBuilder的构造参数中,除了原有的books: books,新增meta字段,其值为嵌套的Map结构,对应目标JSON中的meta对象 - 直接通过
vars.get('searchNo')获取searchNumber对应的变量值 - 如果需要将生成的完整JSON保存为JMeter变量,取消最后一行注释即可
内容的提问来源于stack exchange,提问作者BigPete
相关产品推荐
相关产品推荐

