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
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.