从JSON响应中提取和处理

时间:2016-11-09 13:27:23

标签: jmeter jmeter-plugins

我正在通过输入酒店名称进行酒店搜索.Below是有效的JSON响应。这是对一个酒店搜索的回复。我已经运行了15个线程,并且对于与此类似的不同酒店,我还有14个JSON响应。在此回复中,您可以看到"提供商"和"结果"引用具有数组值的提供者。我的要求是找出每个提供商在所有15家酒店中总共有多少优惠,即结果。

"providers":
    [
        {
            "MM_logofile":"agd.svg",
            "MM_isOfficialWithoutLogo":false,
            "code":"AGD",
            "name":"Agoda.com",
            "logo":"AGD.png",
            "isOfficial":false
        },
        {
            "MM_logofile":"ian.svg",
            "MM_isOfficialWithoutLogo":false,
            "code":"IAN",
            "name":"Hotels.com",
            "logo":"IAN-Other.png",
            "isOfficial":false
        },
        {
            "MM_logofile":"gar.svg",
            "MM_isOfficialWithoutLogo":false,
            "code":"GAR",
            "name":"getaroom.com",
            "logo":"GAR.png",
            "isOfficial":false
        },
        {
            "MM_logofile":"exp.svg",
            "MM_isOfficialWithoutLogo":false,
            "code":"EXP",
            "name":"Expedia.dk",
            "logo":"EXP-DK.png",
            "isOfficial":false
        },
        {
            "MM_logofile":"acc.svg",
            "MM_isOfficialWithoutLogo":false,
            "code":"ACC",
            "name":"AccorHotels.com",
            "logo":"ACC.png",
            "isOfficial":true
        },

    ],

    "results":
    [
        {
            "roomName":"Standard Twin Rm Special Offer - Best price guarantee",
            "totalRate":918.0,
            "isCheapestRate":true,
            "hasFreeCancelation":false,
            "inclusions":
            [
            ],
            "availableRooms":null,
            "providerIndex":0,
            "includesAllTaxes":false,
            "excludedCharges":
            [
                0
            ],
            "bookUri":"https://72750.api.hotelscombined.com/ProviderRedirect.ashx?key=0.11648360.-378376995.495.USD.123155627&source=202-0&a_aid=72750&brandID=177977"
        },
        {
            "roomName":"Standard Double Rm Special Offer - Best price guarantee",
            "totalRate":918.0,
            "isCheapestRate":false,
            "hasFreeCancelation":false,
            "inclusions":
            [
            ],
            "availableRooms":null,
            "providerIndex":0,
            "includesAllTaxes":false,
            "excludedCharges":
            [
                0
            ],
            "bookUri":"https://72750.api.hotelscombined.com/ProviderRedirect.ashx?key=0.11648360.-378376995.496.USD.1523114518&source=202-1&a_aid=72750&brandID=177977"
        },
        {
            "roomName":"Standard Double Room Hot Deal - Best price guarantee",
            "totalRate":918.0,
            "isCheapestRate":false,
            "hasFreeCancelation":false,
            "inclusions":
            [
            ],
            "availableRooms":null,
            "providerIndex":1,
            "includesAllTaxes":false,
            "excludedCharges":
            [
                0
            ],
            "bookUri":"https://72750.api.hotelscombined.com/ProviderRedirect.ashx?key=0.11648360.-378376995.497.USD.573302441&source=202-2&a_aid=72750&brandID=177977"
        },
        {
            "roomName":"Standard Twin Room Hot Deal - Best price guarantee",
            "totalRate":918.0,
            "isCheapestRate":false,
            "hasFreeCancelation":false,
            "inclusions":
            [
            ],
            "availableRooms":null,
            "providerIndex":2,
            "includesAllTaxes":false,
            "excludedCharges":
            [
                0
            ],
            "bookUri":"https://72750.api.hotelscombined.com/ProviderRedirect.ashx?key=0.11648360.-378376995.498.USD.1523907592&source=202-3&a_aid=72750&brandID=177977"
        },
        {
            "roomName":"Standard Room, 1 Double Bed",
            "totalRate":926.2,
            "isCheapestRate":false,
            "hasFreeCancelation":false,
            "inclusions":
            [
            ],
            "availableRooms":null,
            "providerIndex":3,
            "includesAllTaxes":false,
            "excludedCharges":
            [
                0
            ],
            "bookUri":"https://72750.api.hotelscombined.com/ProviderRedirect.ashx?key=0.13476094.-378377052.1210.USD.1325439035&source=202-4&a_aid=72750&brandID=177977"
        },

    ],

1 个答案:

答案 0 :(得分:1)

以下是beanshell代码:

import java.util.HashMap;
import java.util.Map;

results_count = Integer.parseInt(vars.get("results_matchNr"));
providers_count = Integer.parseInt(vars.get("providers_matchNr"));
log.info("total results " + results_count);
Map results = new HashMap();
Map providers = new HashMap();

for(i=1; i<=providers_count; i++){
    log.info("iteration " + i);
    temp = vars.get("providers_"+i);
    log.info("provider_name " + temp);
    providers.put(i-1, temp);
}
log.info("providers: " + providers);

int provider_index = -1;
String provider_name = "";

for(i=1; i<=results_count; i++){
    log.info("iteration " + i);
    provider_index = Integer.parseInt(vars.get("results_"+i));
    log.info("provider_index " + provider_index);
    provider_name = providers.get(provider_index);
    log.info("provider name :" + provider_name);
    if(results.get(provider_name) == null){
        log.info("ading key for the first time " + provider_name);
        results.put(provider_name, 1);
    }
    else{
        log.info("second time " + provider_name);
        int existing = results.get(provider_name);
        log.info("exisiting value " + existing);
        int updateValue = existing+1;
        log.info("updated value: " + updateValue);
        results.put(provider_name, updateValue);
    }
}

log.info("results-providers mapping " + results);

int threadNum = ctx.getThreadNum();

 // if you want to log something to jmeter.log file

// Pass true if you want to append to existing file othewise false.
f = new FileOutputStream("G:\\naveen\\mywork\\testing\\performance\\tools\\jmeter\\examples\\result.csv", true);
p = new PrintStream(f); 
this.interpreter.setOut(p); 
String output = "thread number#" + threadNum + " " + results;
print(output);
f.close();

将BeanShell PostProcessor添加到采样器并添加上面的代码。

enter image description here

添加JSONPATH Extractor以获取提供程序并添加以下语法:

$.providers[*].name

enter image description here

添加另一个JSONPATH Extractor以获取结果/商品并添加以下语法:

$.results[*].providerIndex

enter image description here

注意:更改文件位置以根据您的计算机将结果存储在beanshell代码中。

以下是将保存到文件中的结果:

    thread number#0 {Expedia.dk=1, Agoda.com=2, Hotels.com=1, getaroom.com=1}
thread number#1 {Expedia.dk=1, Agoda.com=2, Hotels.com=1, getaroom.com=1}

//两个线程的两行。在这里,Agoda.com提供商有两个优惠,因此计数为2,其余提供商各有一个。

注意:验证了2个用户的脚本。结果文件中将出现两个条目(一个线程 - >一行)。根据您对beanshell代码的要求(与文件编写相关的代码)来确定foramt。