2013-11-01 11 views
8

Ich habe ein JSON-Feld namens template.welcome.email und ich schreibe einen Komponententest, der prüft, ob dieses Feld in der Antwort vom Server vorhanden ist, aber ich kann kein Escape finden für die Punkte im Namen des Feldes. Der Code von meinem Test ist:JsonPath JUnit Escape-Zeichen für Punkte

@Test 
public void testEmailTemplates() throws Exception {  
    mockMvc.perform(get("/emailTemplates") 
     .contentType(MediaType.APPLICATION_JSON) 
     .locale(Locale.UK) 
     .accept(MediaType.APPLICATION_JSON)) 

     .andDo(print()) 
     .andExpect(status().isOk()) 

     .andExpect(jsonPath("$.template.welcome.email").exists()) 

     .andExpect(redirectedUrl(null)) 
     .andExpect(forwardedUrl(null)); 
} 

Aber ich die folgende Ausnahme erhalten, weil die Punkte wie Pfade interpretiert werden:

java.lang.AssertionError: No value for JSON path: $.template.welcome.email, exception: invalid path 
at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:74) 
at org.springframework.test.util.JsonPathExpectationsHelper.exists(JsonPathExpectationsHelper.java:121) 
at org.springframework.test.web.servlet.result.JsonPathResultMatchers$3.match(JsonPathResultMatchers.java:77) 
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141) 
at 

Kennen Sie ein Escape-Zeichen für die jsonPath?

Antwort

4

Als Idapointed out:

Verwenden Klammern und Anführungszeichen um Ihr Feld. Zum Beispiel wird, wenn Ihr Feld

Siehe es als [ 'valid.key.with.dot'] und in JsonPath, versuchen

JsonPath.read(jsonString, "$.['valid.key.with.dot']")

+0

Ich hatte die gleichen Gedanken, mal sehen ob jemand eine schlaue Idee hat .. – daniele

+0

Ohhh, deshalb funktioniert mein Pfad (mit einem fluchtenden Schrägstrich) nicht! – Tom

+0

Ja, es ist möglich, siehe IDA Antwort –

32

Verwenden valid.key.with.dot Klammern und Anführungszeichen um Ihr Feld. Zum Beispiel, wenn Ihr Feld ist valid.key.with.dot

darauf verweisen, wie ['valid.key.with.dot'] und in JsonPath, versuchen

JsonPath.read(jsonString, "$.['valid.key.with.dot']") 

dieses Thema Siehe auch: https://groups.google.com/forum/#!topic/jsonpath/7YvgXWP1_7Y

+0

Dies funktioniert auch in anderen Bibliotheken, die intern JsonPath verwenden (zum Beispiel REST-gesichert). Danke Ida! –

+0

Just in SOAP UI auch gemacht - JsonPath Match. Funktioniert perfekt! – iaforek

3

In diesen Tagen (zB io.rest-assured.json-path:3.0.1) die Schreibweise ohne Klammern zu sein scheint:

// Some Groovy OData V4 $count test 
// Response looks like: 
// { "@odata.count": 2, ... } 
body "'@odata.count'", equalTo(2) 

fand ich die korr entsprechender Hinweis in this Git issue.