This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/johnzon.git
commit 2511babf3fc4e272a40183e9e5606009231ee6d5 Author: Markus Paeschke <markus.paesc...@gmail.com> AuthorDate: Fri Mar 20 10:58:44 2020 +0100 Added possibility to use minus as array index for the remove operation. --- .../main/java/org/apache/johnzon/core/JsonPointerImpl.java | 7 ++++--- .../test/java/org/apache/johnzon/core/JsonPointerTest.java | 13 +++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java index 89eed57..46d62b3 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java @@ -339,8 +339,7 @@ public class JsonPointerImpl implements JsonPointer { try { JsonArray jsonArray = (JsonArray) jsonValue; - int arrayIndex = Integer.parseInt(referenceToken); - validateArraySize(jsonArray, arrayIndex, jsonArray.size()); + int arrayIndex = getArrayIndex(referenceToken, jsonArray, false); return jsonArray.get(arrayIndex); } catch (NumberFormatException e) { throw new JsonException("'" + referenceToken + "' is no valid array index", e); @@ -460,6 +459,8 @@ public class JsonPointerImpl implements JsonPointer { private int getArrayIndex(String referenceToken, JsonArray jsonArray, boolean addOperation) { if (addOperation && referenceToken.equals("-")) { return jsonArray.size(); + } else if (!addOperation && referenceToken.equals("-")) { + return jsonArray.size() - 1; } validateArrayIndex(referenceToken); @@ -486,7 +487,7 @@ public class JsonPointerImpl implements JsonPointer { } private void validateArrayIndex(String referenceToken) throws JsonException { - if (referenceToken.startsWith("+") || referenceToken.startsWith("-")) { + if (referenceToken.startsWith("+") || (referenceToken.startsWith("-") && referenceToken.length() > 1)) { throw new JsonException("An array index must not start with '" + referenceToken.charAt(0) + "'"); } if (referenceToken.startsWith("0") && referenceToken.length() > 1) { diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java index b07bb6d..f2b7164 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java @@ -457,6 +457,19 @@ public class JsonPointerTest { } @Test + public void testRemoveLastArrayElement() { + JsonPointerImpl jsonPointer = new JsonPointerImpl(JsonProvider.provider(), "/0/-"); + JsonStructure target = Json.createArrayBuilder() + .add(Json.createArrayBuilder() + .add("bar") + .add("qux") + .add("baz")).build(); // [["bar","qux","baz"]] + + JsonStructure result = jsonPointer.remove(target); + assertEquals("[[\"bar\",\"qux\"]]", result.toString()); // [["bar","baz"]] + } + + @Test public void testRemoveObjectMember() { JsonPointerImpl jsonPointer = new JsonPointerImpl(JsonProvider.provider(), "/baz"); JsonStructure target = Json.createObjectBuilder()