1. 程式人生 > >Jmeter_Beanshell_使用Java處理JSON塊

Jmeter_Beanshell_使用Java處理JSON塊

 【環境】

  ①Jmeter版本:3.2,JDK:1.8

  ②前置條件:將json.jar包置於..\apache-jmeter-3.2\lib\下,並將該jar包新增到測試計劃的Library中;否則會報:Typed variable declaration : Class: JSONObject not found in namespace的錯誤;

  ③處理器:Beanshell處理器,import org.json.*;(一般習慣使用到什麼import什麼,如:import org.json.JSONObject、import org.json.JSONAarry;)

【思路】

  ①獲取請求的返回值,即Json響應;

    String response_data = prev.getResponseDataAsString();  //注意此處獲取到的是String型別;

  ②利用上一步獲取的字串形式的JSON,結合Java處理Json的方法,將需要的鍵值提取出來;

    需要利用JSONObject或者JSONArray構造JSON物件。

    JSONObject JsonData = new JSONObject(StrData); 

  ③替換某些需要變更的欄位值,再將新的JSON處理為Jmeter的引數,用於下一個請求的引數化值;

    JsonData.put("status", "CLOSED");

    String NewData = JsonData.toString();

    vars.put("NewStrData",NewData);

【示例1-----JSONObject物件】

  ①獲取到JSON物件,需要提取其中的data物件,並更換“issueHandleType”欄位的值為“CLOSE”,再構造成引數字串;

 

  A請求後新增BeanShell後置處理器,程式碼如下:

import org.json.JSONObject;

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物件】