kk1957
kk1957

Reputation: 8844

Jmeter aggregate certain response values from json to use in next request

I have the following response coming from a request

[
{
    "id": 3767,
    "sellerName": "abc",
    "siteActivity": [
        {
            "siteId": -1,
            "siteName": "example.com",
            "categories": [
                {
                    "categoryId": 79654,
                    "parentId": null,
                    "name": "Photo & Picture Frames",
                    "siteName": null,
                    "channelType": null
                },
                {
                    "categoryId": 114397,
                    "parentId": null,
                    "name": "Chests of Drawers",
                    "siteName": null,
                    "channelType": null
                },
                {
                    "categoryId": 11707,
                    "parentId": null,
                    "name": "Jewellery Boxes",
                    "siteName": null,
                    "channelType": null
                },
                {
                    "categoryId": 45505,
                    "parentId": null,
                    "name": "Serving Trays",
                    "siteName": null,
                    "channelType": null
                }
            ]
        }
    ]
},
{
    "id": 118156,
    "sellerName": "xyz",
    "siteActivity": [
        {
            "categoryId": 45505,
            "parentId": null,
            "name": "Serving Trays",
            "siteName": null,
            "channelType": null
        }
    ]
}
]

Now, I need to extract "id" values and "categoryId" values and send them as list in the next request body.

Currently, I am using JSON Path Extractor with the expression

    $.[*].id

to get my hand on all ids and

    $.[*].siteActivity.[categoryId]

for category ids. Next, I want to use the above values and send them as parameters in request body. Currently, I am able to extract only one id with

   $.[0].id

and then assigning it to variable "id" and using the following in request body

 {"ids":[{"id":"${id}"}]}

but I want to be able to send

 {"ids":[{"id":"${id}"},{"id":"${id2}"}....]}

There is no limit on how many ids can be there, so I cannot hardcode and need something dynamic to do the aggregation. What kind of processor can help me here? Please add some example if you can.

Upvotes: 0

Views: 2044

Answers (1)

Dmitri T
Dmitri T

Reputation: 168217

I believe that you should be able to use Beanshell PostProcessor for building the request.

Given your sample data your $.[*].id JSONPath Expression should return the following values:

id=[3767,118156]
id_1=3767
id_2=118156

So basically you need to:

  1. Determine "id" count
  2. Populate dynamic JSON Object to send
  3. Store it to JMeter variable for later use

In order to do so add a Beanshell PostProcessor after JSONPath Extractor and put the following code into its "Script" area

import net.sf.json.JSONArray;
import net.sf.json.JSONObject; // necessary imports

JSONObject data2Send = new JSONObject();
JSONArray array = new JSONArray(); // instantiate JSON-related classes

int idCount = vars.get("id").split(",").length; // get "id" variables count

for (int i = 1; i <= idCount; i++) { // for each "id" variable
    JSONObject id = new JSONObject(); // construct a new JSON Object
    id.put("id", vars.get("id_" + i));// with name "id" and value id_X 
    array.add(id);  // add object to array
} 

data2Send.put("ids",array); // add array to "ids" JSON Object
vars.put("myJSON", data2Send.toString()); // store value as "myJSON" variable

You can refer to your {"ids":[{"id":"3767"},{"id":"118156"}]} data as ${myJSON} where required.

The approach will play for any number of "id" variables.

References:

Upvotes: 1

Related Questions