JMeter: How to count JSON objects in an Array using jsonpath
Although JSONPath Extractor doesn't provide hasSize
function it still can be done.
Given the example JSON from the answer by PMD UBIK-INGENIERIE, you can get matches number on book
array in at least 2 ways:
1. Easiest (but fragile) way - using Regular Expression Extractor.
As you can see, there are 4 entries for category
like:
{ "category": "reference",
{ \"category\": \"fiction\"
...
If you add a Regular Expression Extractor configured as follows:
It'll capture all the category
entries and return matches number as below:
So you will be able to use this ${matches_matchNr}
variable wherever required.
This approach is straightforward and easy to implement but it's very vulnerable to any changes in the response format. If you expect that JSON data may change in the foreseeable future continue with the next option.
2. Harder (but more stable) way - calling JsonPath methods from Beanshell PostProcessor
JMeter has a Beanshell scripting extension mechanism which has access to all variables/properties in scope as well as to the underlying JMeter and 3rd-party dependencies APIs. In this case you can call JsonPath library (which is under the hood of JsonPath Extractor) directly from Beanshell PostProcessor.
import com.jayway.jsonpath.Criteria;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;
Object json = new String(data);
List categories = new ArrayList();
categories.add("fiction");
categories.add("reference");
Filter filter = Filter.filter(Criteria.where("category").in(categories));
List books = JsonPath.read(json, "$.store.book[?]", new Filter[] {filter});
vars.put("JSON_ARRAY_SIZE", String.valueOf(books.size()));
The code above evaluates JSONPath expression of $.store.book[?]
against parent sampler response, counts matches number and stores it into ${JSON_ARRAY_SIZE}
JMeter Variable
which can later be reused in an if clause or an assertion.
References:
- JMeter – Working with JSON – Extract JSON response
- JMeter's User Manual Regular Expressions entry
- JSON Path Documentation and Examples
- How to use BeanShell: JMeter's favorite built-in component