From 26395bec29ea246e2f2fb5c741af812c288b458a Mon Sep 17 00:00:00 2001 From: saphy86 Date: Thu, 13 Feb 2020 23:48:44 +0800 Subject: [PATCH] Add escape to path string --- .../internal/path/PropertyPathToken.java | 12 +++++++++- .../com/jayway/jsonpath/PathCompilerTest.java | 23 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PropertyPathToken.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PropertyPathToken.java index 74d280e4..246af559 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PropertyPathToken.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PropertyPathToken.java @@ -97,9 +97,19 @@ class PropertyPathToken extends PathToken { @Override public String getPathFragment() { + // Add escape characters to string of property paths that it can be recompile to JsonPath + List outputProperties = new ArrayList(properties.size()); + for (String property : properties) { + String outputProperty = property + // "\" to "\\" + .replaceAll("\\\\", "\\\\\\\\") + // "'" to "\'" + .replaceAll("'", "\\\\'"); + outputProperties.add(outputProperty); + } return new StringBuilder() .append("[") - .append(Utils.join(",", stringDelimiter, properties)) + .append(Utils.join(",", stringDelimiter, outputProperties)) .append("]").toString(); } } diff --git a/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java b/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java index ef220619..ae7e01ed 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java @@ -323,4 +323,27 @@ public class PathCompilerTest { public void property_must_be_separated_by_commas() { compile("$['aaa'}'bbb']"); } + + @Test + public void property_with_escape_characters() { + String json = "{\n" + + " \"a']['b\": 1,\n" + + " \"\\\\']['b\": 2\n" + + "}"; + DocumentContext parse = JsonPath.parse(json); + + JsonPath compile1 = JsonPath.compile("$['a\\'][\\'b']"); + int result1 = parse.read(compile1); + assertThat(result1).isEqualTo(1); + + JsonPath compile2 = JsonPath.compile("$['\\\\\\'][\\'b']"); + int result2 = parse.read(compile2); + assertThat(result2).isEqualTo(2); + + // not "$['a']['b']" + assertThat(compile("$['a\\'][\\'b']").toString()).isEqualTo("$['a\\'][\\'b']"); + + // not "$['\']['b']" + assertThat(compile("$['\\\\\\'][\\'b']").toString()).isEqualTo("$['\\\\\\'][\\'b']"); + } }