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

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; }

 

转载于:https://www.cnblogs.com/nieliangcai/p/10535194.html

更多相关:

  • 学习计划 MyPlan11 主题:Python描述统计、简单统计图形 时间:8.5-8.11周内完成 参考资料:新书《谁说菜鸟不会数据分析python篇》 各位星友们,在这个星球里每个人都要逼迫自己学习未知的领域或知识点,每天进步一点点,积累的时间久了 ,菜鸟也能起飞。 完成情况: 在pandas中,使用describe函数进行描述统...

  • 利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer。 TCPServer/UDPS...

  • 题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。 示例:  你可以将以下二叉树:     1    /   2   3      /     4   5 序列化为 "[1,2,3,null,null,4,5]" 解题: /*** Definition for a binary tree no...

  • sd.js  import $global from "./global"; import $g from "./sg"; import $ from "jquery"; import {Message, Loading} from "element-ui";//引入饿了么相关组件 import {Base64} from "js-...

  •     原生sd.js----------------------------------------------------------------  const API_ROOT_URL = "http://www.api.com";const $d= {_postList_url: API_ROOT_URL + "/api...

  • 点云PCL免费知识星球,点云论文速读。文章:DSP-SLAM: Object Oriented SLAM with Deep Shape Priors作者:Jingwen Wang Martin Runz Lourdes Agapito编译:点云PCL代码:https://github.com/JingwenWang95/DSP-S...

  • RAM缓存 新RAM缓存算法(CLFUS) 新的RAM缓存使用的创意来自许多缓存替换策略和算法,包括LRU,LFU,CLOCK,GDFS及2Q,它被命名为时钟周期内最小频繁使用大小算法CLFUS(Clocked Least Frequently Used by Size)。它避开了任何专利算法,具有如下特性: 均衡最近性(Rec...

  • MP4 |视频:AVC,1280×720 30 fps |音频:AAC,48 KHz,2 Ch |时长:2h 12m 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D,您可以使用3D对象、动态效果和动画来增强运动图形、模型和可视化效果。本课...

  • 文章目录先说问题:再说解决尝试1:尝试2(该尝试建议先在自己环境搭配对应业务测试通过后再现场尝试): 感谢 学无止境996同学的陪伴和vigourtyy美丽女友的支持,直到这个解决问题的深夜 先说问题: ceph 12.2.1生产环境:3副本 tier + 3副本data 机房在拥有业务的情况下重启集群交换机,产生如下场景...

  • 这周主要学习了java中的类和对象的知识点,发现和C++中的类和对象极为相似,对于类和对象的概念理解起来也简单。同时在自学的过程中也把类的知识重新复习巩固了一下(如类的三大特征:继承,封装和多态,构造,成员对象的访问权限,构造,无参有参函数的调用等),同时也了解到一些新的概念,比如类对象创建和引用占据堆内存和栈内存,输出对象时默认调...