2016-11-09 115 views
0

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

"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

代码在哪里? json在哪里? – Weedoze

+0

尝试添加部分json,并将建立在 –

+1

我正在做它。我的回复太长,所以无法发布。给我一分钟。 – Jane

回答

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

enter image description here

添加JSONPATH提取得到的提供商,并添加以下语法:

$.providers[*].name 

enter image description here

添加另一个JSONPATH提取得到的结果/报价,并添加以下语法:

$.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代码(与文件编写相关的代码)的要求来调整窗口。

+0

非常感谢你。这是我的预期。是否可以合并来自所有线程的所有结果并为每个提供商提供优惠的数量?就像在你的例子中,它会是Expedia.dk = 2,Agoda = 4,Hotels.com = 2,getaroom.com = 2 – Jane

+0

我认为这是不可能的,因为所有线程并行运行,并且每个线程运行它自己的BeanShell副本PostProcessor中。你必须在执行后执行此操作。 –

+0

好的。感谢Naveen的帮助 – Jane