2016-08-31 2 views
3

Я пытаюсь извлечь значение одной переменной массива JSON, используя Beanshell постпроцессор, но я не получаю никакого ответа в журналеизвлекая JSON ответ с использованием Bean Shell постпроцессор

Моя JSON несколько выглядит следующим образом:

"store": 
 
: [ 
 
: : { 
 
: : : "storeId":12345, 
 
: : : "storeName":"ABC", 
 
: : : "storeAddress":"DEFGHIJKL", 
 
: : : "storeMinOrderAmount":100, 
 
: : : "mobile":"+911234567890", 
 
: : : "mobileSecondary":null, 
 
: : : "city":"Somewhere", 
 
: : : "pincode":123456, 
 
: : : "country":"India", 
 
: : : "email":"[email protected]", 
 
: : : "pickup":true, 
 
: : : "delivery":false, 
 
: : : "storeSplashPath":null, 
 
: : : "storeSplashType":null, 
 
: : : "distance":"0.10" 
 
: : },

И мой Beanshell сообщение Процессор:

import org.apache.commons.lang3.StringUtils; 
import org.json.JSONArray; 
import org.json.JSONObject; 
import com.eclipsesource.json.*; 

print("*******************"); 

//Get Store total count 
int totalStoreNumber = StringUtils.countMatches(new String(data), "storeId"); 
print("Total Number of Stores are: " + totalStoreNumber); 

if (totalStoreNumber > 0) { 
//Check for Fulfilment type is "Pickup" 
String jsonString = prev.getResponseDataAsString(); 
JsonObject store = JsonObject.readFrom(jsonString); 
JsonArray store = store.get("store").asArray(); 
String pickup = store.get(1).asObject().get("pickup").asString(); 
vars.put("fulfilmentType_BSH", pickup); 
print("Is Pickup allowed: " + pickup); 
} 
else { 
print("No Stores Nearby"); 
} 

Я не знаю, где я ошибаюсь. Я прочитал связанные запросы, но не мог понять это правильно. Любая идея?

ответ

6

Прежде всего, почему бы вам не использовать JSON Path PostProcessor? Вы можете получить абсолютно то же самое с помощью одного простого JSON Path выражения, как:

$.store[0].pickup 

Если по какой-либо причине вы все еще нужно сделать это в Beanshell у меня есть некоторые идеи:

  1. Это, безусловно, Ошибка. Вы не можете объявить 2 переменные с тем же именем в Beanshell скриптом

    JsonObject store = JsonObject.readFrom(jsonString); 
    JsonArray store = store.get("store").asArray(); 
    //  ^^^^^ ka-boom! 
    
  2. Возможные проблемы. IndexOutOfBoundsException, если в ответе будет только 1 магазин. В Beanshell равны нулю на основе коллекции, первый элемент будет иметь индекс 0.

    String pickup = store.get(1).asObject().get("pickup").asString(); 
    //      ^ka-boom! 
    
  3. Другая возможная проблема может быть относительно вашего импорта, только в случае

    import org.json.JSONArray; 
    import org.json.JSONObject; 
    import com.eclipsesource.json.*; 
    

    Вы добавили соответствующие банки для JMeter Classpath и после этого вы перезапустили JMeter? Вы уверены, что правильно используете методы?

Вот ваш код повторно реализован с использованием json-smart, который поставляется с JMeter 3.0 (вам не нужны никакие другие банки)

import net.minidev.json.JSONArray; 
import net.minidev.json.JSONObject; 
import net.minidev.json.parser.JSONParser; 
import org.apache.commons.lang.StringUtils; 

//Get Store total count 
int totalStoreNumber = StringUtils.countMatches(new String(data), "storeId"); 
log.info("Total Number of Stores are: " + totalStoreNumber); 

if (totalStoreNumber > 0) { 
    //Check for Fulfilment type is "Pickup" 
    String jsonString = new String(data); 
    JSONParser parser = new JSONParser(JSONParser.MODE_JSON_SIMPLE); 
    JSONObject store = (JSONObject) parser.parse(data); 
    JSONArray storeArray = (JSONArray) store.get("store"); 
    String pickup = ((JSONObject) storeArray.get(0)).getAsString("pickup"); 
    vars.put("fulfilmentType_BSH", pickup); 
    log.info("Is Pickup allowed: " + pickup); 
} else { 
    log.info("No Stores Nearby"); 
} 

И доказательства своей работы

Beanshell JSON demo

См. Руководство How to Use BeanShell: JMeter's Favorite Built-in Component для получения дополнительной информации об использовании скриптов Beanshell в тестах JMeter