Чтение файла json в виде строки json и извлечение данных в сэмплере jsr223, отличный язык в jmeter - PullRequest
0 голосов
/ 06 ноября 2018

import com.jayway.jsonpath.JsonPath

def pathToRead = someFilePath;
def pathToWrite = someOtherFilePath;

def newLine = System.getProperty('line.separator')
def index = [];
def randoms = [];
def temp;

//generating random numbers
def size = new File(pathToRead + "index.csv").readLines().size();
for(int i=0; i<vars.get('extractCount'); i++)
{
	randoms << org.apache.commons.lang3.RandomUtils.nextInt(0, size-1);
}

//Reading file names to extract data
File file = new File(pathToRead + "index.csv");
file.each { line ->
	index << line
}

def nameCSV = new File(pathToWrite + 'name.csv')
def nameGivenCSV = new File(pathToWrite + 'given.csv')
def givenList = []
def nameFamilyCSV = new File(pathToWrite + 'family.csv')
def familyList = []

//going through each json file and extracting data and storing in lists
randoms.unique().each { random ->
	jsonString = new groovy.json.JsonSlurper().parseText(new File(pathToRead + "Data/fhir/" + index.getAt(random)).text);
	def names = JsonPath.read(jsonString, '$..name')
	names.each { name ->
		name.each { subName ->
			subName.get('given').each { givenName ->
				if(givenName != null)
					givenList << givenName
			}

			temp = subName.get('family')
			if(temp != null)
				familyList << temp        
		}
	}	
}


//Writing data to files after removing the duplicates
givenList.unique().each { single_given -> 
		nameCSV << single_given << newLine
		nameGivenCSV << single_given << newLine
	}
	familyList.unique().each { single_family ->
		nameCSV << single_family << newLine
		nameFamilyCSV << single_family << newLine
	}

Это дает ошибку, говоря Проблема в сценарии JSR223 ExtractRandomData, сообщение: javax.script.ScriptException: groovy.lang.MissingMethodException: Нет сигнатуры метода: java.lang.String.get () не подходит для типов аргументов: (java.lang.String) значения: [ учитывая]

, что означает, что он не позволяет мне применять subName.get ('данное');

данные json в файле похожи на

"name": [
          {
            "use": "official",
            "family": "Cortez851",
            "given": [
              "Benito209"
            ],
            "prefix": [
              "Mr."
            ]
          }
        ]

1 Ответ

0 голосов
/ 06 ноября 2018

Ваш код соответствует предоставленным вами данным JSON и должен работать нормально. Однако, если посмотреть на ошибку, которую вы получаете для некоторых файлов, структура отличается.

Вы можете обойти это, явно проверив тип subname, который вы получаете, используя оператор instanceof , например:

names.each { name ->
    name.each { subName ->
        if (subName instanceof Map) {
            subName.get('given').each { givenName ->
                if (givenName != null)
                    givenList << givenName
            }
        } else if (subName instanceof String) {
            givenList << subName
        } else {
            log.error('Expected Map or String, got' + subName.getClass().getName())
        }


        temp = subName.get('family')
        if (temp != null)
            familyList << temp
    }
}

Демо-версия:

enter image description here

Другие улучшения:

  1. Похоже, вы вообще не используете JsonSlurper , поэтому вы можете просто упростить эту строку:

    jsonString = new groovy.json.JsonSlurper().parseText(new File(pathToRead + "Data/fhir/" + index.getAt(random)).text);
    

    к этому jsonString = новый файл (pathToRead + "Data / fhir /" + index.getAt (random)). text

  2. Эта строка никогда не будет посещать последнее значение в index.csv

    randoms << org.apache.commons.lang3.RandomUtils.nextInt(0, size-1);
    

    Вы должны изменить его на

    randoms << org.apache.commons.lang3.RandomUtils.nextInt(0, size);
    
  3. Вы можете поместить свой код в глобальный блок try и распечатать проблемный JSON в файл jmeter.log в случае сбоя

Дополнительная информация:

...