jmeter beanshell(java)解析json串(含数组及多层对象)获取指定数据

一、解析接口请求返回json中含数组的一层对象的简单结构

1 数据结构如下:

  {
    "data": [
        {
            "cpid": "20190904162049UyPhgiTkUAoQ8w0i70BdnqQybmB4",
            "dbServerName": "192.168.31.11"
        },
        {
            "cpid": "20190906113836wyzwnK9IWdfYhI2kwxNoTPGbv8W6",
            "dbServerName": "172.15.103.27"
        }
    ],
    "pageIndex": 0,
    "pageNo": 1,
    "pageSize": 10
}

2. 如解析1中的数据,指定ip为192.168.31.11的cpid,代码如下:

import org.json.JSONObject;       //需要jmeter的lib/ext中放入 json.jar包
import org.json.JSONArray;

//获取jmeter接口请求返回值。此处获取到String类型;
String response_data = prev.getResponseDataAsString(); 
//log.info("response_data------>"+response_data);  //jmeter beanshell打印出返回的结果

JSONObject data_obj = new JSONObject(response_data);    //将接口响应结果转换为jsonobject对象
JSONArray data_array = data_obj.getJSONArray("data"); //获取响应结果中参数data值; data为数组
//log.info("data_array------>"+data_array.toString()); 

int len = data_array.length(); //获取data数组的长度

String strlen = Integer.toString(len);
String cpidR="";
//循环data数据中的数据找到要获取的指定数据
for(int i = 0;i <len;i++){
    JSONObject jsonTemp = (JSONObject)data_array.getJSONObject(i); 
    //log.info("jsonTemp------>"+jsonTemp.toString());
    String dbServerName = jsonTemp.get("dbServerName").toString(); //获取data中的dbServerName
    //log.info("dbServerName"+i+"------>"+dbServerNameR);
    
    if(dbServerName.equals("192.168.31.11") )
    {
    	    cpidR = jsonTemp.get("cpid").toString();  //将满足条件的数据获取赋值给全局变量cpidR
        break;
    }else{
        continue;
    }
}
 log.info("cpidR------>"+cpidR); 
 vars.put("orcl_cpid",cpidR);  //将获取的满足条件的cpidR值存为jmeter变量,提供下个接口使用,下个接口直接使用此处的${orcl_cpid}即可
 return "成功返回cpid";

二、解析接口请求返回json中含数组的多层对象的复杂结构

1. json数据结构

{
    "data": [
        {
            "cpid": "20190904162049UyPhgiTkUAoQ8w0i70BdnqQybmB4",
            "dbServerName": "192.168.31.11"
             “coonpool”:
              {
                 “poolid”:“123456789”,
                 “poolname”:“nametest”
              }==  //第二层对象
        },
        {
            "cpid": "20190906113836wyzwnK9IWdfYhI2kwxNoTPGbv8W6",
            "dbServerName": "172.15.103.27"
             “coonpool”:
              {
                 “poolid”:“A123456789”,
                 “poolname”:“nametest”
              }
        }
    ],
    "pageIndex": 0,
    "pageNo": 1,
    "pageSize": 10
}

2. jmeter使用beanshell解析的java代码如下:
需求:获取poolid为123456789的poolname与cpid

import org.json.JSONObject; 
import org.json.JSONArray;

//获取请求返回值。此处获取到String类型;
String response_data = prev.getResponseDataAsString(); 
log.info("response_data------>"+response_data);

JSONObject data_obj = new JSONObject(response_data);
JSONArray data_array = data_obj.getJSONArray("data"); //获取响应结果中参数data值; data为数组

log.info("data_array------>"+data_array.toString()); 
int len = data_array.length(); //获取data数组的长度

String strlen = Integer.toString(len);
String cpid ="";
String poolname="";

for(int i = 0;i <len;i++){
    JSONObject responseRunVo1 = (JSONObject)data_array.getJSONObject(i); 
    JSONObject responseRunVo2 = (JSONObject)jsonTemp.getJSONObject("connpool");
    
  //  log.info("获取数组的第二层对象元素:"+responseRunVo);
  
    String poolidR= responseRunVo2.getString("poolid");
    if (poolidR.equals("123456789") )
    {
    	   cpid =responseRunVo1.getString("cpid");   //第一层对象的数据
    	   poolname= responseRunVo2.getString("poolname");  //第二层对象的数据    	   
        break;
    }else{
        continue;
    }
}
 log.info("cpid------>"+cpid); 
 log.info("poolname------>"+poolname); 

 vars.put("orcl_cpid",cpid);
 vars.put("orcl_poolname",poolname);
//下个接口可以直接使用变量orcl_cpid与orcl_poolname获取结果值
 return "成功返回";
<think>好的,用户想了解JMeter中的BeanShellPostProcessor的用法和功能。我需要结合用户提供的引用资料来整理答案。首先,用户之前的问题是关于LoopController的,现在转向后置处理器,可能需要更深入的技术细节。根据引用[1],BeanShell PostProcessor是一个强大的工具,允许在收到响应后执行自定义操作。这应该作为核心功能来介绍。引用[2]提到它用于处理接口间的关联参数,比如提取返回值,所以需要说明如何提取数据。引用[3]提到可以用Java进行逻辑判断,处理复杂数据结构,比如多个list中的字段,这部分可以举例说明。引用[4]提供了具体的代码示例,可以展示如何解析JSON响应并提取特定字段,比如waitRepayAmount,这里需要解释代码的结构和关键点。引用[5]展示了如何格式化响应结果,比如替换字符,并重新设置响应内容,这也是一个重要的使用场景。接下来要组织回答结构,分点说明功能和用法。功能方面包括数据提取、动态处理、变量传递、响应修改等。用法部分需要步骤说明,比如添加后置处理器、编写脚本、使用内置对象等。代码示例需要适当简化,并注释关键部分,帮助用户理解。注意事项部分要提到性能影响和脚本复杂度,避免用户滥用。 另外,用户可能对如何调试脚本处理更复杂数据结构有疑问,所以相关问题可以包括这些方面。需要确保引用正确,每个功能点后面加上对应的引用标记,比如[^1]、[^2]等。最后,检查是否有遗漏的功能用法,确保覆盖所有引用资料中的信息,并且语言清晰易懂,适合不同层次的用户。</think>### BeanShell PostProcessor 在 JMeter 中的用法与功能详解 #### 1. 核心功能 - **响应数据提取**:通过脚本解析 JSON/XML 等格式的响应内容,提取特定字段值(如提取 `waitRepayAmount` 字段)[^4] - **动态数据处理**:支持 Java 语法处理复杂数据结构(例如多层嵌套的 `List` `Map`)[^3] - **变量传递**:将提取值存入 JMeter 变量(`vars.put()`),供后续请求使用[^4] - **响应内容修改**:可格式化重构响应数据(如替换 HTML 实体字符 `<` 为 `<`)[^5] - **条件逻辑处理**:通过 `if-else` 实现动态分支判断(例如根据 `status` 字段筛选数据)[^4] #### 2. 典型使用场景 ```python # 伪代码流程示例(实际为BeanShell脚本): 1. 获取前序请求响应 → prev.getResponseDataAsString() 2. 解析数据JSONObject/JSONArray 处理 3. 条件筛选 → 遍历数组并判断字段值 4. 存储变量 → vars.put("变量名", 提取值) ``` #### 3. 具体配置步骤 1. **添加处理器** 右键点击目标取样器 → `Add → Post Processors → BeanShell PostProcessor` 2. **编写脚本** ```java // 示例:提取多层 JSON 中的字段[^4] import org.json.*; String response = prev.getResponseDataAsString(); // 获取响应内容 JSONObject root = new JSONObject(response); JSONArray plans = root.getJSONObject("data").getJSONArray("repayPlanList"); for (int i=0; i<plans.length(); i++) { JSONObject plan = plans.getJSONObject(i); if (plan.getString("status").equals("1")) { vars.put("amount", plan.getString("waitRepayAmount")); // 存储变量 break; } } ``` 3. **使用内置对象** - `prev`:访问前序请求对象(如 `prev.getResponseCode()`) - `vars`:操作 JMeter 变量(`vars.get("varName")`) - `log`:输出调试日志(`log.info("Message: " + value)`)[^5] #### 4. 特殊功能扩展 - **动态修改响应**: ```java // 替换响应中的转义字符[^5] String modifiedResponse = prev.getResponseDataAsString() .replace("&lt;", "<") .replace("&gt;", ">"); prev.setResponseData(modifiedResponse); // 重写响应内容 ``` - **复杂计算逻辑**: $$ \text{利息计算} = \sum_{i=1}^{n} (本金_i \times 利率_i) $$ 可通过循环累加实现多期利息计算[^3] #### 5. 注意事项 - **性能影响**:复杂脚本会增加测试资源消耗,建议优先使用正则表达式提取器[^1] - **脚本调试**:通过 `log.info()` 输出中间值验证逻辑[^5] - **依赖管理**:若使用外部库(如 JSON-Java),需将 JAR 包放入 `JMETER_HOME/lib`[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值