BeanShell使用json.jar包处理Json数据

环境准备

  ①Jmeter版本 ,JDK 

  ②前置条件:将json.jar包置于..\lib\下,

      如果还是报错,可以将该jar包添加到测试计划的Library中;否则会报:Typed variable declaration : Class: JSONObject not found in namespace的错误;

  ③处理器:Beanshell处理器,import org.json.*;  

      也可以 import org.json.JSONObject;、import org.json.JSONAarry;主要是处理这两种类型的数据,Json对象和Json数组

eg:例子来源于https://blog.csdn.net/weixin_42204641/article/details/82850659

 JSONObject:{"name":"tom"}、{"name":["tome","kate"]}            

复制代码
// 先设置1个JSONObject、一个JSONArray  
JSONObject jsono = new JSONObject();
JSONArray  jsona = new JSONArray();

//JSONArray传值
jsona.put("tom");
jsona.put("kate");//["tom","kate"]

//JSONObject传值
jsono.put("name",jsona);//{"name":["tom","kate"]}
复制代码

   JSONAarry:[{"name":"tom"},{"name":"kate"}]

复制代码
JSONArray jsona = new JSONArray();

JSONObject jsono1 = new JOSNObject();

JSONObject jsono2 = new JSONObject();

jsono1.put("name","tom");//{"name":"tom"}
jsono2.put("name","kate");//{"name":"kate"}

jsona.put(json1,json2);//[{"name":"tom"},{"name":"tom"}]
复制代码

主流思想

  1.获取response返回的数据(返回值)    

    String response_data = prev.getResponseDataAsString(); //自定义一个变量response_data,来获取请求的返回值String

  2.利用上一步获取的字符串形式的JSON,结合Java处理Json的方法,将需要的键值提取出来;

    JSONObject response =  new JSONObject(response_data); //自定义一个对象response,将返回值构造JSON对象

    这里构造的是JSONObject(对象JSON)也可以自己构造JSONAarry(数组对象)方法是一样的  JSONArray jsona = new JSONArray();

  3.获取需要拿到的数据

    String total_metaData = response.get("data").get("pageMetaData").get("totalSize").toString();   //.get("data").get("pageMetaData")

   4.设置为Jmeter中的全局变量,供后续使用

    vars.put("total_meta",total_metaData);      //这里设置的全局变量,在本脚本中无效--${total_meta}是错误的

【示例1-----JSONObject对象】

  ①获取到JSON对象,需要提取其中的data对象,并更换“issueHandleType”字段的值为“CLOSE”,再构造成参数字符串;

 

  A请求后添加BeanShell后置处理器,代码如下:

复制代码
import org.json.*;

String response_data = prev.getResponseDataAsString(); //获取请求返回值。注意此处只能获取到String类型;
log.info(response_data);

JSONObject data_obj = new JSONObject(response_data); //将String类型的返回值构造成JSONObject对象,才可使用Java对象的方法对其进行操作;

String StrData = data_obj.get("data").toString(); //获取作为下一个请求post的参数值data;
log.info(StrData); //Log中显示的字段顺序会与“response_data”中的字段顺序有差异,JSON串的正确与否无关字段顺序;

JSONObject JsonData = new JSONObject(StrData); //将获取到的“data”字符串构造成JSON对象;

JsonData.put("issueHandleType", "CLOSE"); //更新issueHandleType的json值;
JsonData.put("solution", "2017_解决方案_性能测试");
JsonData.put("status", "CLOSED");
JsonData.put("handleType", "CLOSE");
JsonData.put("complaintTypeSecondCode", "URGE"); //异常类型;
JsonData.put("complaintTypeSecondName", "催件"); 
JsonData.put("lastUpdateTime", "${timestamp}");
JsonData.put("lastUpdator", "${UserName}");
JsonData.put("lastUpdatorName", "${UserName}");

String NewData = JsonData.toString(); //将JSON对象保存为String类型,Jmeter中的请求的参数均以字符串的形式传递; 
vars.put("NewStrData",NewData);
log.info(NewData);
复制代码

【示例2-----JSONArray对象】

  需要提取返回值中,每一个对象数组中的每一个 uuid 及 id 的键值:获取JSON对象,再提取data数组内容并获取data数组长度,最后循环提取每一个 uuid 及 id 的键值;备注:1个客服同时与10个客户聊天,在聊天开始之前,需要捞取到这10个客户的uuid(uuid)及conversationId(id);

复制代码
//import org.json.*;
import
org.json.JSONObject; import org.json.JSONArray; try { String response_data = prev.getResponseDataAsString(); //获取请求返回值。注意此处只能获取到String类型; JSONObject data_obj = new JSONObject(response_data); //将String类型的返回值构造成JSONObject对象; JSONArray data_array = data_obj.getJSONArray("data"); //data为数组 int len = data_array.length(); //获取data数组的长度 String strlen = Integer.toString(len); vars.put("MessageNum",strlen); //log.info(strlen); int i = 0; for(;i < len;++i) { JSONObject jsonTemp = (JSONObject)data_array.getJSONObject(i); //获取 data[ i ] 数组对象; switch(i) { case 0: vars.put("uuid_1", jsonTemp.getString("uuid")); vars.put("conversationId_1", jsonTemp.getString("id")); break; case 1: vars.put("uuid_2", jsonTemp.getString("uuid")); vars.put("conversationId_2", jsonTemp.getString("id")); break; //..................................此处省去7次处理 case 10: vars.put("uuid_11", jsonTemp.getString("uuid")); vars.put("conversationId_11", jsonTemp.getString("id")); break; default: break; } } } catch (Throwable ex) { log.error("Failed in Beanshell", ex); throw ex; }
复制代码

 

posted @   小心走火  阅读(2723)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示