count members with jsonpath? count members with jsonpath? java java

count members with jsonpath?


To test size of array: jsonPath("$", hasSize(4))

To count members of object: jsonPath("$.*", hasSize(4))


I.e. to test that API returns an array of 4 items:

accepted value: [1,2,3,4]

mockMvc.perform(get(API_URL))       .andExpect(jsonPath("$", hasSize(4)));

to test that API returns an object containing 2 members:

accepted value: {"foo": "oof", "bar": "rab"}

mockMvc.perform(get(API_URL))       .andExpect(jsonPath("$.*", hasSize(2)));

I'm using Hamcrest version 1.3 and Spring Test 3.2.5.RELEASE

hasSize(int) javadoc

Note:You need to include hamcrest-library dependency and import static org.hamcrest.Matchers.*; for hasSize() to work.


You can also use the methods inside the jsonpath, so instead of

mockMvc.perform(get(API_URL))   .andExpect(jsonPath("$.*", hasSize(2)));

you can do

mockMvc.perform(get(API_URL))   .andExpect(jsonPath("$.length()", is(2)));


We can use JsonPath functions like size() or length(), like this:

@Testpublic void givenJson_whenGetLengthWithJsonPath_thenGetLength() {    String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}";    int length = JsonPath        .parse(jsonString)        .read("$.length()");    assertThat(length).isEqualTo(3);}

Or simply parsing to net.minidev.json.JSONObject and get the size:

@Testpublic void givenJson_whenParseObject_thenGetSize() {    String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}";    JSONObject jsonObject = (JSONObject) JSONValue.parse(jsonString);    assertThat(jsonObject)        .size()        .isEqualTo(3);}

Indeed, the second approach looks to perform better than the first one. I made a JMH performance test and I get the following results:

| Benchmark                                       | Mode  | Cnt | Score       | Error        | Units ||-------------------------------------------------|-------|-----|-------------|--------------|-------|| JsonPathBenchmark.benchmarkJSONObjectParse      | thrpt | 5   | 3241471.044 | ±1718855.506 | ops/s || JsonPathBenchmark.benchmarkJsonPathObjectLength | thrpt | 5   | 1680492.243 | ±132492.697  | ops/s |

The example code can be found here.