Сгенерируйте тело json, используя groovy в jmeter, имея массив внутри массива

Я пытаюсь динамически генерировать тело JSON, используя значения в файле csv. Для этого я использую JSR223 PreProcessor с отличным скриптом. Я ожидаю, что приведенный ниже формат будет сгенерирован при запуске скрипта groovy.

    {
    "transactionId": "100",
    "lineItems": [{
            "lineItemNo": "1",
            "cardInfo": {
                "cardNumber": "3456"
            }
        },
        {
            "lineItemNo": "2",
            "cardInfo": {
                "cardNumber": "45698"
            }
        }
    ]
}

но когда я выполняю скрипт, я получаю формат ниже

POST data:
{
    "transactionId": "100",
    "lineItems": [
        {
            "lineItemNo": "1",
            "Cardinfo": [
                9255000012794606,
                9255000012794645
            ]
        },
        {
            "lineItemNo": "1",
            "Cardinfo": [
                9255000012794606,
                9255000012794645
            ]
        }
    ]
}

Скрипт для генерации json-тела

File csvFile = new File("D:\\Project Related Docs\\Jmeter\\apache-jmeter-5.0\\bin\\Map_Performance\\Map_New_Auto_jmx\\2Cards.csv")
def cards = csvFile.readLines()
List<String> cardnumbmer = new ArrayList<>()
def counter = 1
cards.eachWithIndex{line,idx->cardnumbmer.add(line)}
log.info("size of csv = "+cardnumbmer.size())
log.info("File conents = "+cardnumbmer[0])

//build the json body
def ids = new groovy.json.JsonSlurper().parseText(cardnumbmer.toString())
log.info("cardnumbmer to string = "+cardnumbmer.toString())
def builder = new groovy.json.JsonBuilder()

builder([
    transactionId:"100",
    lineItems:ids.collect{[lineItemNo:"1",Cardinfo: ids.collect{carnumber: it}]}
    ])

//sampler.getArguments().removeAllArguments()
sampler.addNonEncodedArgument('',builder.toPrettyString(),'')
sampler.setPostBodyRaw(true);

--CSV-ФАЙЛ содержит номера карт, перечисленные построчно, как показано ниже: 9255000012794606 9255000012794645

Просьба помочь мне узнать, как решить эту проблему.


person Praveen PS    schedule 01.04.2020    source источник
comment
я думаю, вы должны предоставить пример файла csv, чтобы понять, как вы хотите построить json...   -  person daggett    schedule 01.04.2020
comment
Файл CSV содержит только номера карт в строках типа - 9255000012794606 9255000012794645   -  person Praveen PS    schedule 02.04.2020


Ответы (2)


ids.collect{carnumber: it} в основном ids. Недвусмысленно сообщите о возврате карты: ids.collect{ [carnumber: it] }

person cfrick    schedule 01.04.2020
comment
Обновлено, чтобы вернуть карту и явно, и была сделана небольшая настройка в коде компоновщика, и это решило проблему - builder([ transactionId:100, lineItems:ids.collect{[lineItemNo:1,Cardinfo: [Cardnumber:it]]} ]) выход соответствует ожиданиям - person Praveen PS; 02.04.2020

Ниже код решил проблему

//build the json body
def ids = new groovy.json.JsonSlurper().parseText(cardnumbmer.toString())
log.info("cardnumbmer to string = "+cardnumbmer.toString())
def builder = new groovy.json.JsonBuilder()
def count = 1

builder([
    transactionId:"100",
    //lineItems:ids.collect{[lineItemNo:"1",Cardinfo: count.collect{[carnumber: it]}]}
    lineItems:ids.collect{[lineItemNo:count++,Cardinfo: [Cardnumber:it]]}
    ])

//sampler.getArguments().removeAllArguments()
sampler.addNonEncodedArgument('',builder.toPrettyString(),'')
sampler.setPostBodyRaw(true);
person Praveen PS    schedule 02.04.2020
comment
Мы также можем использовать это решение stackoverflow.com/questions/41989897/ - person Praveen PS; 03.04.2020