提取Json响应创建动态变量并分配值

时间:2017-07-04 13:59:25

标签: json jmeter

我想从json响应中提取值并将值分配给变量并在后续请求中使用它们。

请求1响应

{
  "XXX":"Test Company 1",
  "YYY":"Test Company 2",
  "ZZZ":"Test Company 3"
}

我想创建动态变量和值,如下所示。

Company_Name_1 = "Test Company 1"
Company_Code_1 = "XXX"
Company_Name_2 = "Test Company 2"
Company_Code_2 = "YYY"
Company_Name_3 = "Test Company 3"
Company_Code_3 = "ZZZ"

并在后续请求中使用上述变量,如下所示。

请求2参数

{
    "Date": "${MeetingDate}",
    "StartTime": "${StartTime}",
    "EndTime": "${EndTime}",
    "InvestorsByDate": [{
        "Name": "${Company_Name_1}",
        "Code": "${Company_Code_1}"
    },
    {
        "Name": "${Company_Name_2}",
        "Code": "${Company_Code_2}"
    },
    {
        "Name": "${Company_Name_3}",
        "Code": "${Company_Code_3}"
    }]
}

公司总数不是一个常数,它不断变化。所以我需要编写一个代码来捕获动态值并将它们分配给动态创建的变量,然后在后续请求中使用它们。我完全不熟悉脚本。请帮我面对这个挑战。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

  1. JSR223 PostProcesor添加为第一个请求的子项
  2. 确保您使用groovy语言并勾选Cache compiled script if available
  3. 将以下代码放入“脚本”区域:

    import groovy.json.JsonBuilder
    import groovy.json.JsonSlurper
    
    def companies = new JsonSlurper().parse(prev.getResponseData())
    def jsonBuilder = new JsonBuilder()
    jsonBuilder {
        "Date"   vars.get('MeetingDate')
        "StartTime" vars.get('StartTime')
        "EndTime" vars.get('EndTime')
        "InvestorsByDate" companies.collect {
            [
                Name: it.getValue(),
                Code: it.getKey()
            ]
        }
    }
    vars.put('requestBody', jsonBuilder.toPrettyString())
    log.info('Generated body: ' + vars.get('requestBody'))
    
  4. 您可以将生成的JSON Payload称为${requestBody}${__V(requestBody)},如果需要,
  5. 演示:

    JMeter Generate JSON

    参考文献:

答案 1 :(得分:0)

@Dmitri T谢谢,它非常有用,我做了一个修改并按预期工作。

import groovy.json.JsonBuilder
import groovy.json.JsonSlurper

    def companies = new JsonSlurper().parse(prev.getResponseData())
    def jsonBuilder = new JsonBuilder()
    jsonBuilder {"InvestorsByDate"companies.collect{[IdString: it.getKey(),Name: it.getValue()]}
    }
    vars.put('InvestorsByDate', jsonBuilder.toString())
    vars.put('InvestorsByDate', vars.get('InvestorsByDate').substring(1))
    vars.put('InvestorsByDate', vars.get('InvestorsByDate').substring(0,vars.get('InvestorsByDate').length() - 1))

    log.info(vars.get('InvestorsByDate'))

我还需要一个帮助,请尽可能做。是否可以更改公司名称,如下所示。

"InvestorsByDate": [{
    "Name": "1. Company Name1",
    "Code": "Company_Code_1"
},
{
    "Name": "2. Company Name2",
    "Code": "Company_Code_2"
},
{
    "Name": "3. Company Name3",
    "Code": "Company_Code_3"
}]

我想用公司名称连接号码。在json builder中可以吗?