前段時間在使用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; }
執行結果如下: