From 97db5795bd9c9037a7d6dea4d8cd0b502fdfc01f Mon Sep 17 00:00:00 2001 From: Alexey Makeyev Date: Fri, 16 Oct 2015 15:10:57 +0300 Subject: [PATCH] fix for escaped backslash in property inside predicate --- .../java/com/jayway/jsonpath/internal/PathCompiler.java | 9 ++++++++- .../src/test/java/com/jayway/jsonpath/PredicateTest.java | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/PathCompiler.java b/json-path/src/main/java/com/jayway/jsonpath/internal/PathCompiler.java index e6b73385..a92c4a94 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/PathCompiler.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/PathCompiler.java @@ -292,7 +292,7 @@ public class PathCompiler { start--; } - int mem = ' '; + int mem = -1; int curr = start; boolean inProp = false; int openSquareBracket = 0; @@ -317,6 +317,13 @@ public class PathCompiler { } } break; + case '\\': + if (mem == '\\') { // escaped backslash, skip it + mem = -1; + curr++; + continue; + } + break; case '\'': if(mem == '\\') { break; diff --git a/json-path/src/test/java/com/jayway/jsonpath/PredicateTest.java b/json-path/src/test/java/com/jayway/jsonpath/PredicateTest.java index 472cb641..fb619ec2 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/PredicateTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/PredicateTest.java @@ -25,17 +25,17 @@ public class PredicateTest extends BaseTest { assertThat(reader.read("$.store.book[?].isbn", List.class, booksWithISBN)).containsOnly("0-395-19395-8", "0-553-21311-3"); } - @Ignore("not ready yet (requires compiler reimplementation)") @Test public void issue_predicate_can_have_escaped_backslash_in_prop() { String json = "{\n" + " \"logs\": [\n" + " {\n" - + " \"message\": \"it\\\",\n" + + " \"message\": \"it\\\\\",\n" + " \"id\": 2\n" + " }\n" + " ]\n" + "}"; + // message: it\ -> (after json escaping) -> "it\\" -> (after java escaping) -> "\"it\\\\\"" List result = JsonPath.read(json, "$.logs[?(@.message == 'it\\\\')].message");