【Jmeter】Beanshell处理提取出来的列表字符串转数组对象

前段时间在使用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;
}

执行结果如下:

posted @ 2022-01-30 11:04  潘潘达  阅读(2457)  评论(0编辑  收藏  举报