В настоящее время я пытаюсь извлечь идентификатор поля из ответа Vaadin json, чтобы обнаружить все поля со списком (RTFComboBox) и обработать их дальше. Пример ответа (урезано):

for(;;);[{
    "syncId": 113,
    "clientId": 113,
    "changes": [],
    "state": {
        "1273": {
            "caption": "",
            "styles": ["tokenfield", "tokentextfield"]
        },
        "1274": {
            "styles": ["RTFTokenField"]
        },
        "1275": {
            "width": "185.0px",
            "immediate": true,
            "styles": ["RTFTokenField", "RTFComboBox", "tiny"],
            "registeredEventListeners": ["focus"]
        }
    }
}]

Мне нужно получить номер идентификатора (здесь 1275), я могу иметь дело с мусором «for (;;)», но не могу извлечь правильные значения идентификатора. Я пытался использовать Regex Extractor, но это решение не очень гибкое (или я просто не могу написать правильное выражение).

Есть идеи, как получить родительский идентификатор, когда дочерний массив стилей содержит RTFComboBox? Может быть, здесь требуется какое-то более сложное решение, например какой-нибудь скрипт на Groovy, чем JSON Extractor от JMeter?

0
mKD 28 Июн 2017 в 13:49

2 ответа

Я бы посоветовал написать отличный скрипт в процессоре beanshell, проанализировать JSON и затем получить все ключи для объекта состояния. Вот фрагмент кода, убедитесь, что вы добавили java-json.jar в папку JMETER_HOME / lib

    try {

        String jsonString = prev.getResponseDataAsString();
        JSONArray jsonArray =  new JSONArray(jsonString);
        JSONObject object = jsonArray.getJSONObject(0);
        JSONObject states = object.getJSONObject("state");
        String keys[] = states.getNames(states);

        for(int i=0; i< keys.length; i++) {
            log.info(keys[i]);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
0
manish 29 Июн 2017 в 11:17

Наконец-то я сделал это с помощью JsonSlurper, это мой скрипт JSR223 PostProcessor:

import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
def response = jsonSlurper.parseText(prev.getResponseDataAsString().drop(8))
//drop to remove for(;;); junk preventing proper parse
def map = [:]
response.state[0].each {k, v -> if(v.styles != null && v.styles.contains("RTFComboBox")) {map.put(k, v)}}
//map contains key (field id-most important to me) and key (rest of values in node)

Если вам нужно какое-то конкретное значение, просто в строке map.put установите v.field, то есть:

map.put (k, v.immediate)

0
mKD 29 Июн 2017 в 12:53