计数与jsonpath成员?

有没有可能计算使用JsonPath的成员数量?

使用弹簧MVCtesting我正在testing一个控制器,产生

{"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来对它们进行计数。 可能吗? 备用解决scheme也是受欢迎的。

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

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


即testing该API返回4个项目的数组

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

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

testing该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

我今天一直在处理这个问题。 这似乎并没有在可用的断言中实现。 但是,有一种方法可以传入org.hamcrest.Matcher对象。 有了这个,你可以做如下的事情:

 final int count = 4; // expected count jsonPath("$").value(new BaseMatcher() { @Override public boolean matches(Object obj) { return obj instanceof JSONObject && ((JSONObject) obj).size() == count; } @Override public void describeTo(Description description) { // nothing for now } }) 

如果您的类path中没有com.jayway.jsonassert.JsonAssert (这是我的情况),则以下面的方式进行testing可能是一种可能的解决方法:

 assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size()); 

[注意:我认为json的内容总是一个数组]