如何使用jsonpath计算成员数?

是否可以使用 JsonPath 计算成员数?

使用Spring MVC测试,我正在测试一个控制器,该控制器生成

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

跟:

standaloneSetup(new FooController(fooService)).build()
    .perform(get("/something").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
    .andExpect(jsonPath("$.foo").value("oof"))
    .andExpect(jsonPath("$.bar").value("rab"));

我想确保生成的json中没有其他成员。希望通过使用jsonPath来计算它们。可能吗?也欢迎替代解决方案。


答案 1

测试数组的大小:jsonPath("$", hasSize(4))

要对对象的成员进行计数:jsonPath("$.*", hasSize(4))


即,测试API返回一个包含4个项目的数组

接受的值:[1,2,3,4]

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

测试 API 是否返回包含 2 个成员的对象:

接受的值:{"foo": "oof", "bar": "rab"}

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

我使用的是Hamcrest版本1.3和Spring Test 3.2.5.RELEASE。

hasSize(int) javadoc

注意:您需要包含 hamcrest-library 依赖项,并且 hasSize() 才能正常工作。import static org.hamcrest.Matchers.*;


答案 2

您还可以使用 jsonpath 中的方法,而不是

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

你可以做

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