从 JSON 响应中提取和处理

Extracting and processing from JSON response

我正在通过输入酒店进行酒店搜索 names.Below 是有效的 JSON 响应。这是一次酒店搜索的回复。我有 运行 15 个线程,我还有 14 个 JSON 对与此类似的不同酒店的响应。在此响应中,您可以看到 "providers" 和 "results" 引用具有数组值的提供程序。我的要求是找出有多少报价,即每个供应商在所有 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"
        },

    ],

豆壳代码如下:

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 添加到采样器中,并添加上面的代码。

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

$.providers[*].name

添加另一个 JSONPATH 提取器以获取 results/offers 并添加以下语法:

$.results[*].providerIndex

注意:更改文件位置以根据您的机器在 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代码(与文件编写相关的代码)的要求更改格式。