前段时间在使用JSON提取器提取接口返回值字段时,遇到个问题:该字段的值是一个列表(数组)字符串,也就是说不能按照Jsonpath的方式继续往下提取字符串列表里面的值了,那么该怎么处理这种情况呢?
如下图:要提取hierarchy字符串里面的某个objectId值
使用Json提取器只能提取到hierarchy整个字符串,无法继续往下提取了,Json提取器结果如下
此时该怎么做呢?
解决思路:使用fastjson,将字符串列表转为数组,然后按照数组提取需要的值,再将这个值存到变量中,这样就可以在后续请求中使用了
实现步骤:
1、根据使用的jmeter版本下载对应的fastjson.jar包,下载地址:https://mvnrepository.com/artifact/com.alibaba/fastjson
2、在jmeter包根路径下新建个文件夹,暂时就叫 third 吧(表示三方下载的包),把下载的fastjson包放在这个目录下,如下:
3、在测试计划下,添加这个jar包路径
4、在提取到 hierarchy 字符串列表的请求下,添加Beanshell后置处理器,输入以下代码
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath; import java.util.List; try { // 将提取到的hierarchy字符串存到变量data中 String data = vars.get("hierarchy"); log.info("-----------------------------" + data); // 将数组字符串转成数组(注意:如果返回的是字典格式,此处则使用JSONObject来声明变量,同时转化的函数要使用JSON.parseObject,即JSONObject data_arr = JSON.parseObject(data)) JSONArray data_arr = JSON.parseArray(data); log.info("-----------------------------" + data_arr); // 由于数组里面是字典,所以此处使用getJSONObject方法来获取指定下标成员字典,然后调用get方法获取字典中指定字段的值 String item_type = data_arr.getJSONObject(0).get("name"); log.info("-----------------------------" + item_type); // 将获取到的值放到变量item_type中,这样就可以使用${item_type}来调用变量了,注意:变量名必须要用""引起来 vars.put("item_type", item_type) } catch (Throwable ex) { log.error("Beanshell failure: ", ex); throw ex; }
执行结果如下: