Merge pull request #588 from fossterer/563-jsonpointer-do-not-encode-quotes

JSONPointer should not process reverse solidus or double-quote chars in tokens
This commit is contained in:
Sean Leary 2021-03-06 10:00:32 -06:00 committed by GitHub
commit c43e21ae73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 13 deletions

View File

@ -187,10 +187,11 @@ public class JSONPointer {
this.refTokens = new ArrayList<String>(refTokens); this.refTokens = new ArrayList<String>(refTokens);
} }
/**
* @see https://tools.ietf.org/html/rfc6901#section-3
*/
private static String unescape(String token) { private static String unescape(String token) {
return token.replace("~1", "/").replace("~0", "~") return token.replace("~1", "/").replace("~0", "~");
.replace("\\\"", "\"")
.replace("\\\\", "\\");
} }
/** /**
@ -263,16 +264,15 @@ public class JSONPointer {
/** /**
* Escapes path segment values to an unambiguous form. * Escapes path segment values to an unambiguous form.
* The escape char to be inserted is '~'. The chars to be escaped * The escape char to be inserted is '~'. The chars to be escaped
* are ~, which maps to ~0, and /, which maps to ~1. Backslashes * are ~, which maps to ~0, and /, which maps to ~1.
* and double quote chars are also escaped.
* @param token the JSONPointer segment value to be escaped * @param token the JSONPointer segment value to be escaped
* @return the escaped value for the token * @return the escaped value for the token
*
* @see https://tools.ietf.org/html/rfc6901#section-3
*/ */
private static String escape(String token) { private static String escape(String token) {
return token.replace("~", "~0") return token.replace("~", "~0")
.replace("/", "~1") .replace("/", "~1");
.replace("\\", "\\\\")
.replace("\"", "\\\"");
} }
/** /**

View File

@ -117,14 +117,24 @@ public class JSONPointerTest {
assertSame(document.get("m~n"), query("/m~0n")); assertSame(document.get("m~n"), query("/m~0n"));
} }
/**
* We pass backslashes as-is
*
* @see https://tools.ietf.org/html/rfc6901#section-3
*/
@Test @Test
public void backslashEscaping() { public void backslashHandling() {
assertSame(document.get("i\\j"), query("/i\\\\j")); assertSame(document.get("i\\j"), query("/i\\j"));
} }
/**
* We pass quotations as-is
*
* @see https://tools.ietf.org/html/rfc6901#section-3
*/
@Test @Test
public void quotationEscaping() { public void quotationHandling() {
assertSame(document.get("k\"l"), query("/k\\\\\\\"l")); assertSame(document.get("k\"l"), query("/k\"l"));
} }
@Test @Test
@ -189,7 +199,7 @@ public class JSONPointerTest {
.append("\"") .append("\"")
.append(0) .append(0)
.build(); .build();
assertEquals("/obj/other~0key/another~1key/\\\"/0", pointer.toString()); assertEquals("/obj/other~0key/another~1key/\"/0", pointer.toString());
} }
@Test @Test