Repository: johnzon Updated Branches: refs/heads/master e6d79e356 -> f41430773
Fix issues related to JsonPointer remove operation Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/cb6004d9 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/cb6004d9 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/cb6004d9 Branch: refs/heads/master Commit: cb6004d907d67780b6b91f44c8fc1128648cd3da Parents: e6d79e3 Author: Ravisankar Challa <[email protected]> Authored: Fri Jul 27 06:18:54 2018 +1000 Committer: Ravisankar Challa <[email protected]> Committed: Fri Jul 27 06:19:28 2018 +1000 ---------------------------------------------------------------------- .../apache/johnzon/core/JsonPointerImpl.java | 19 +++++++----- .../apache/johnzon/core/JsonPointerTest.java | 32 ++++++++++++++++++++ 2 files changed, 43 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/cb6004d9/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPointerImpl.java ---------------------------------------------------------------------- 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 b0ac822..f9aab6f 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 @@ -283,7 +283,7 @@ public class JsonPointerImpl implements JsonPointer { public JsonObject remove(JsonObject target) { validateRemove(target); - return (JsonObject) remove(target, 1, referenceTokens.size() - 1); + return (JsonObject) remove(target, 1, referenceTokens.size() - 1, referenceTokens); } /** @@ -299,7 +299,7 @@ public class JsonPointerImpl implements JsonPointer { public JsonArray remove(JsonArray target) { validateRemove(target); - return (JsonArray) remove(target, 1, referenceTokens.size() - 1); + return (JsonArray) remove(target, 1, referenceTokens.size() - 1, referenceTokens); } String getJsonPointer() { @@ -409,7 +409,7 @@ public class JsonPointerImpl implements JsonPointer { currentPath.get(currentPath.size() - 1).equals(referenceTokens.get(referenceTokens.size() - 2)); } - private JsonValue remove(JsonValue jsonValue, int currentPosition, int referencePosition) { + private JsonValue remove(JsonValue jsonValue, int currentPosition, int referencePosition, List<String> referenceTokens) { if (jsonValue instanceof JsonObject) { JsonObject jsonObject = (JsonObject) jsonValue; JsonObjectBuilder objectBuilder = provider.createObjectBuilder(); @@ -419,7 +419,7 @@ public class JsonPointerImpl implements JsonPointer { && lastReferenceToken.equals(entry.getKey())) { continue; } - objectBuilder.add(entry.getKey(), remove(entry.getValue(), currentPosition + 1, referencePosition)); + objectBuilder.add(entry.getKey(), remove(entry.getValue(), currentPosition + 1, referencePosition, referenceTokens)); } return objectBuilder.build(); } else if (jsonValue instanceof JsonArray) { @@ -427,16 +427,19 @@ public class JsonPointerImpl implements JsonPointer { JsonArrayBuilder arrayBuilder = provider.createArrayBuilder(); int arrayIndex = -1; - if (currentPosition == referencePosition) { - arrayIndex = getArrayIndex(lastReferenceToken, jsonArray, false); + if (referenceTokens.size() > currentPosition && referenceTokens.get(currentPosition).matches("\\d+")) { + arrayIndex = getArrayIndex(referenceTokens.get(currentPosition), jsonArray, false); } int jsonArraySize = jsonArray.size(); for (int i = 0; i < jsonArraySize; i++) { if (i == arrayIndex) { - continue; + if (currentPosition != referencePosition) { + arrayBuilder.add(remove(jsonArray.get(i), currentPosition + 1, referencePosition, referenceTokens)); + } + } else { + arrayBuilder.add(jsonArray.get(i)); } - arrayBuilder.add(remove(jsonArray.get(i), currentPosition + 1, referencePosition)); } return arrayBuilder.build(); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/cb6004d9/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java ---------------------------------------------------------------------- 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 616b8bb..a5841a4 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 @@ -476,6 +476,38 @@ public class JsonPointerTest { assertEquals("{\"foo\":\"bar\"}", result.toString()); // {"foo":"bar"} } + @Test + public void testRemoveFieldMemberWithObjectAndArray() { + JsonPointerImpl jsonPointer = new JsonPointerImpl(JsonProvider.provider(), "/test/status"); + JsonStructure target = Json.createObjectBuilder() + .add("test", Json.createObjectBuilder().add("status", "200")) + .add("array", Json.createArrayBuilder().build()).build(); // {"test":{"status":"200"},"array":[]} + + JsonStructure result = jsonPointer.remove(target); + assertEquals("{\"test\":{},\"array\":[]}", result.toString()); // {"foo":"bar"} + } + + @Test + public void testRemoveFieldMemberWithNestedArray() { + JsonStructure target = Json.createObjectBuilder() + .add("test", Json.createArrayBuilder().add( + Json.createObjectBuilder().add("OK", "200")).add( + Json.createObjectBuilder().add("REDIREDT", + Json.createArrayBuilder().add( + Json.createObjectBuilder().add("CREATED", "201")) + .add(Json.createObjectBuilder() + .add("UNAUTH", "201") .add("ACCEPTED", "202"))))) + .build(); + // {"test":[{"OK":"200"},{"REDIREDT":[{"CREATED":"201"},{"UNAUTH":"401","ACCEPTED":"202"}]}]} + JsonPointerImpl jsonPointer = new JsonPointerImpl(JsonProvider.provider(), "/test/1/REDIREDT/1/UNAUTH"); + JsonStructure result = jsonPointer.remove(target); + assertEquals("{\"test\":[{\"OK\":\"200\"},{\"REDIREDT\":[{\"CREATED\":\"201\"}" + + ",{\"ACCEPTED\":\"202\"}]}]}", result.toString()); + jsonPointer = new JsonPointerImpl(JsonProvider.provider(), "/test/1/REDIREDT/1"); + result = jsonPointer.remove(target); + assertEquals("{\"test\":[{\"OK\":\"200\"},{\"REDIREDT\":[{\"CREATED\":\"201\"}]}]}", result.toString()); + } + @Test(expected = NullPointerException.class) public void testReplaceJsonObjectWithTargetNull() { JsonPointerImpl jsonPointer = new JsonPointerImpl(JsonProvider.provider(), "/");
