Browse Source

Add escape to path string

pull/595/head
saphy86 4 years ago
parent
commit
26395bec29
  1. 12
      json-path/src/main/java/com/jayway/jsonpath/internal/path/PropertyPathToken.java
  2. 23
      json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java

12
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<String> outputProperties = new ArrayList<String>(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();
}
}

23
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']");
}
}

Loading…
Cancel
Save