From 775c98ea41a5236751f7284e76e3b9b4e5df5a0b Mon Sep 17 00:00:00 2001 From: Jake Wang Date: Fri, 18 Sep 2026 20:10:16 -0400 Subject: [PATCH] Avoid decoding JSON Pointer tokens twice --- src/main/java/org/json/JSONPointer.java | 2 +- .../java/org/json/junit/JSONPointerTest.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/json/JSONPointer.java b/src/main/java/org/json/JSONPointer.java index 34066c1aa..f4cff541c 100644 --- a/src/main/java/org/json/JSONPointer.java +++ b/src/main/java/org/json/JSONPointer.java @@ -203,7 +203,7 @@ public Object queryFrom(Object document) throws JSONPointerException { Object current = document; for (String token : this.refTokens) { if (current instanceof JSONObject) { - current = ((JSONObject) current).opt(unescape(token)); + current = ((JSONObject) current).opt(token); } else if (current instanceof JSONArray) { current = readByIndexToken(current, token); } else { diff --git a/src/test/java/org/json/junit/JSONPointerTest.java b/src/test/java/org/json/junit/JSONPointerTest.java index a420b297f..bbea5d2a3 100644 --- a/src/test/java/org/json/junit/JSONPointerTest.java +++ b/src/test/java/org/json/junit/JSONPointerTest.java @@ -98,6 +98,32 @@ public void tildeEscaping() { assertEquals(8, query("/m~0n")); } + @Test + public void escapeSequencesInObjectKeys() { + JSONObject object = new JSONObject().put("~1", "tilde one").put("/", "slash") + .put("~0", "tilde zero").put("~", "tilde"); + assertEquals("tilde one", object.query("/~01")); + assertEquals("tilde zero", object.query("/~00")); + assertEquals("tilde one", object.query("#/~01")); + assertEquals("tilde zero", object.query("#/~00")); + } + + @Test + public void builderPreservesLiteralTokens() { + JSONObject object = new JSONObject().put("~1", "tilde one").put("/", "slash") + .put("~0", "tilde zero").put("~", "tilde"); + assertEquals("tilde one", JSONPointer.builder().append("~1").build().queryFrom(object)); + assertEquals("tilde zero", JSONPointer.builder().append("~0").build().queryFrom(object)); + } + + @Test + public void tokenListPreservesLiteralTokens() { + JSONObject object = new JSONObject().put("~1", "tilde one").put("/", "slash") + .put("~0", "tilde zero").put("~", "tilde"); + assertEquals("tilde one", new JSONPointer(java.util.Arrays.asList("~1")).queryFrom(object)); + assertEquals("tilde zero", new JSONPointer(java.util.Arrays.asList("~0")).queryFrom(object)); + } + /** * We pass backslashes as-is *