compter les membres avec jsonpath?

Est-il possible de compter le nombre de membres utilisant JsonPath?

En utilisant le test spring-mvc, je teste un contrôleur qui génère

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

avec

 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")); 

Je voudrais m’assurer qu’aucun autre membre n’est présent dans le json généré. En espérant les compter en utilisant jsonPath. C’est possible? Des solutions alternatives sont également les bienvenues.

Pour tester la taille du tableau : jsonPath("$", hasSize(4))

Pour compter les membres de l’ object : jsonPath("$.*", hasSize(4))


C’est-à-dire que cette API retourne un tableau de 4 éléments:

valeur acceptée: [1,2,3,4]

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

tester cette API renvoie un object contenant 2 membres:

valeur acceptée: {"foo": "oof", "bar": "rab"}

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

J’utilise Hamcrest version 1.3 et Spring Test 3.2.5.RELEASE

hasSize (int) javadoc

J’ai eu affaire à moi-même aujourd’hui. Il ne semble pas que cela soit implémenté dans les assertions disponibles. Cependant, il existe une méthode pour transmettre un object org.hamcrest.Matcher . Avec cela, vous pouvez faire quelque chose comme ceci:

 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 } }) 

Si vous n’avez pas com.jayway.jsonassert.JsonAssert sur votre com.jayway.jsonassert.JsonAssert de com.jayway.jsonassert.JsonAssert (ce qui était le cas avec moi), le test suivant peut être une solution possible:

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

[note: j’ai supposé que le contenu de json est toujours un tableau]

Nous pouvons utiliser les fonctions JsonPath comme size() ou length() , comme ceci:

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

ou simplement parsingr à net.minidev.json.JSONObject et obtenir de taille:

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

En effet, la seconde approche semble donner de meilleurs résultats que la première. J’ai effectué un test de performance JMH et j’ai obtenu les résultats suivants:

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

L’exemple de code peut être trouvé ici .