使用 beanshell 在 jmeter 中获取 json 响应

Fetching json response in jmeter using beanshell

In my jmeter response i have javascript and json as a mix response from that i have to fetch a JSON array which is items Here is part of a huge response which i am getting

DE.APP.task.TaskGrid.getAssignmentData = function () {
                return {"items":[]};
            };

            DE.APP.task.TaskGrid.getResourceData = function () {
                return {"items":[{"STANDARDRATEFORMAT":"0.00","ASSIGNED_HRS":0,"RESOURCE_NAME":"#Buddhika ","COST":"0.00","PERCENTASSIGNED":"100.00","EMAIL":"Buddhika75@mspblank.com","AVAILABLEFROM":"10-May-2011","ALLOCATED_HRS":"1872.00","RESOURCE_ID":36197221,"AVAILABLETO":"31-Mar-2012","calendar":{"exceptions":{},"weekDayHours"

In this response i have to fetch the json array which is in getResourceData() and not any other items. How can we do this with beanshell assrtion?

您可以使用 Regular Expressions. As action is need to perform on the response of particular request[sampler], you should use Post-Processors as child of that particular request. So basically use Regular Expression Extractor 提取响应的任何部分。

假设你的反应是这样的---

我已经完成了 JSON 对象的数组并添加了一些可能存在的提示。这是我所做的假设。请检查您的实际回复。

DE.APP.task.TaskGrid.getAssignmentData = function () {
            return {"items":[]};
        };

        DE.APP.task.TaskGrid.getResourceData = function () {
            return {"items":[{"STANDARDRATEFORMAT":"0.00","ASSIGNED_HRS":0,"RESOURCE_NAME":"#Buddhika ","COST":"0.00","PERCENTASSIGNED":"100.00","EMAIL":"Buddhika75@mspblank.com","AVAILABLEFROM":"10-May-2011","ALLOCATED_HRS":"1872.00","RESOURCE_ID":36197221,"AVAILABLETO":"31-Mar-2012","calendar":{"exceptions":{},"weekDayHours":{}}}]}
            
            AnotherBlockthatYouCanIDenity

所以你可以拥有 Post-这样的处理器-

请注意,此 RE 可能不正确,因为我不确定您收到的回复。请检查您的回复。您也可以在查看结果树侦听器中测试您的正则表达式。

您可以使用 apache StringUtils 使用左边界和右边界来切割字符串。您的左边界很清楚 "return {" 但我不确定您的右边界(跟在您的 JSON 负载后面的字符串)。在下面的示例中,我使用 ]} 作为分隔符来削减 JSON 有效负载。使用 prev.getResponseDataAsString() 将响应负载作为字符串拉取。

import org.apache.commons.lang3.StringUtils;
import net.minidev.json.parser.JSONParser;
import net.minidev.json.JSONObject;
import net.minidev.json.JSONArray;

String sInputString =  "return {\"items\":[{\"STANDARDRATEFORMAT\":\"0.00\",\"ASSIGNED_HRS\":0,\"RESOURCE_NAME\":\"#Buddhika \",\"COST\":\"0.00\",\"PERCENTASSIGNED\":\"100.00\",\"EMAIL\":\"Buddhika75@mspblank.com\",\"AVAILABLEFROM\":\"10-May-2011\",\"ALLOCATED_HRS\":\"1872.00\",\"RESOURCE_ID\":36197221,\"AVAILABLETO\":\"31-Mar-2012\",\"calendar\":{\"exceptions\":{},\"weekDayHours\":{}}}]}";

//String sInputString = prev.getResponseDataAsString();

try {
     // Use StringUtils to cut the string between the two
    String sCutString = StringUtils.substringBetween(sInputString, "return {\"items", "]}");
    String sFinalString = "{\"items" + sCutString + "]}";
    log.info("sFinalString=" + sFinalString);

    // Use JSONParser to parse the JSON
    JSONParser parser = new JSONParser(JSONParser.ACCEPT_NON_QUOTE|JSONParser.ACCEPT_SIMPLE_QUOTE); 
    JSONObject rootObject = (JSONObject) parser.parse(sFinalString);
    //JSONObject rootObject = (JSONObject) parser.parse(prev.getResponseDataAsString());

    JSONArray jResourceArray = (JSONArray) rootObject.get("items");

    for (int i=0; i < jResourceArray.size(); i++) {
        log.info(jResourceArray.get(i).toString());
        // You can access individual elements using this
        log.info("RESOURCE_ID=" + jResourceArray.get(i).get("RESOURCE_ID"));
    }


}
catch ( Exception ex) {
    log.info("Exception.." + ex);
}