Json 作為一種數(shù)據(jù)交換格式在網(wǎng)絡(luò)開(kāi)發(fā),特別是 RESTful(Representational State Transfer)架構(gòu)中應(yīng)用得越來(lái)越廣泛。Jmeter是一款很適合做接口和性能的測(cè)試工具,對(duì)于下面這一段Json 格式的響應(yīng)報(bào)文我們可以在jmeter里面使用三種不同的方法來(lái)進(jìn)行數(shù)據(jù)的抽取工作。
{
: "code":"000000",
: "data":
: {
: : "pageCount":"1",
: : "prizeLists":
: : [
: : : {
: : : : "cellphoneNum":"134****0001",
: : : : "prizeId":"1000005",
: : : : "prizeName":"10元話費(fèi)"
: : : },
: : : {
: : : : "cellphoneNum":"134****0001",
: : : : "prizeId":"1000007",
: : : : "prizeName":"4元話費(fèi)"
: : : }
: : ],
: : "totalCount":"2"
: },
: "msg":"成功"
}
1)使用正則表達(dá)式提取prizeName的第二個(gè)值
在Sampler上面添加后置處理器-->正則表達(dá)式提取器,
引用名稱(chēng):其他地方引用提取值的變量名稱(chēng),這里填寫(xiě)的是:prizeNameValue,具體的引用方式是${prizeNameValue}。
正則表達(dá)式:提取內(nèi)容的正則表達(dá)式【()表示提取,對(duì)于你要提前的內(nèi)容需要用小括號(hào)括起來(lái)】。
模板:用$$引用起來(lái),如果在正則表達(dá)式中有多個(gè)提取表達(dá)式(多個(gè)括號(hào)括起來(lái)的部分),則可以是$1$,$2$等等,表示解析到的第幾個(gè)值給prizeNameValue,正則表達(dá)式的提取模式,值從1開(kāi)始,值0對(duì)應(yīng)的是整個(gè)匹配的表達(dá)式。
匹配數(shù)字(0代表隨機(jī)):0代表隨機(jī),-1代表所有,其余正整數(shù)代表將在已提取的內(nèi)容中第幾個(gè)匹配的內(nèi)容。這里需要提取的是第二個(gè)匹配的值。
缺省值:正則匹配失敗時(shí)取的值。
可以在jmeter中添加Sampler -->Debug Sampler來(lái)看正則表達(dá)式的取值。
從上圖中可以看出提取到的prizeNameValue的值是4元話費(fèi)。
2)使用 JMeter 的插件JSONPath 來(lái)獲取 JSON 數(shù)據(jù)中特定位置的數(shù)據(jù)
在jmeter的plugins網(wǎng)站http://jmeter-plugins.org/downloads/all/ 選擇 JMeterPlugins-ExtrasLibs-X.X.X.zip下載,解壓以后將lib和lib/ext中的jar包放到j(luò)meter安裝目錄對(duì)應(yīng)位置,然后重啟jmeter。
在Sampler上面添加后置處理器-->jp@gc - JSON Path Extractor,
在DebugSampler的結(jié)果中可以看到prizeNameJson的取值是4元話費(fèi)。
3)使用JMeter的BeanShell Post Processor來(lái)處理Json數(shù)據(jù)
將fastjson.jar 拷貝到 jmeter lib 文件夾下后重啟 jmeter
在Sampler上面添加后置處理器-->BeanShell PostProcessor
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
String json=prev.getResponseDataAsString();
JSONObject jso = JSON.parseObject(json);
JSONObject data = jso.getJSONObject("data");
JSONArray prizeLists = data.getJSONArray("prizeLists");
vars.put("prizeNameValue",prizeLists.getJSONObject(1).getString("prizeName"));
在DebugSampler的結(jié)果中可以看到prizeNameValue的取值是4元話費(fèi)。
總結(jié)
本文列舉出了三種可用的從 Json 格式的返回值中提取數(shù)據(jù)的方法。正則表達(dá)式對(duì)于簡(jiǎn)單的 Json 格式數(shù)據(jù)的處理非常快速標(biāo)準(zhǔn)化,JsonPath 插件可以創(chuàng)建能夠被維護(hù)的腳本,引入fastjson庫(kù)的BeanShell 依賴(lài)于 Java 語(yǔ)言的靈活性可以進(jìn)行進(jìn)一步的開(kāi)發(fā)。大家可以根據(jù)自己的習(xí)慣和喜好選擇任意一種進(jìn)行數(shù)據(jù)的提取。