diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/PathRef.java b/json-path/src/main/java/com/jayway/jsonpath/internal/PathRef.java index 48b36ed9..50c03d79 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/PathRef.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/PathRef.java @@ -4,6 +4,7 @@ import com.jayway.jsonpath.*; import com.jayway.jsonpath.spi.json.JsonProvider; import java.util.Collection; +import java.util.List; public abstract class PathRef implements Comparable { @@ -138,10 +139,12 @@ public abstract class PathRef implements Comparable { private static class ArrayIndexPathRef extends PathRef { private int index; + private Object value; private ArrayIndexPathRef(Object parent, int index) { super(parent); this.index = index; + this.value = ((List) parent).get(index); } public void set(Object newVal, Configuration configuration){ @@ -149,7 +152,7 @@ public abstract class PathRef implements Comparable { } public void delete(Configuration configuration){ - configuration.jsonProvider().removeProperty(parent, index); + configuration.jsonProvider().removeProperty(parent, value); } public void add(Object value, Configuration configuration){ diff --git a/json-path/src/main/java/com/jayway/jsonpath/spi/json/AbstractJsonProvider.java b/json-path/src/main/java/com/jayway/jsonpath/spi/json/AbstractJsonProvider.java index 0a7d7275..e8d9deaf 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/spi/json/AbstractJsonProvider.java +++ b/json-path/src/main/java/com/jayway/jsonpath/spi/json/AbstractJsonProvider.java @@ -106,16 +106,16 @@ public abstract class AbstractJsonProvider implements JsonProvider { * Removes a value in an object or array * * @param obj an array or an object - * @param key a String key or a numerical index to remove + * @param key a String key or an object in a Collection to be removed. */ @SuppressWarnings("unchecked") public void removeProperty(Object obj, Object key) { if (isMap(obj)) ((Map) obj).remove(key.toString()); else { - List list = (List) obj; - int index = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString()); - list.remove(index); + Collection collection = (Collection) obj; + //int index = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString()); + collection.remove(key); } } diff --git a/json-path/src/test/java/com/jayway/jsonpath/WriteTest.java b/json-path/src/test/java/com/jayway/jsonpath/WriteTest.java index 6e12d71c..2924d956 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/WriteTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/WriteTest.java @@ -123,6 +123,15 @@ public class WriteTest extends BaseTest { assertThat(res).containsExactly("reference"); } + @Test + public void an_array_criteria_with_multiple_results_can_be_deleted(){ + String deletePath = "$._embedded.mandates[?(@.count=~/0/)]"; + DocumentContext documentContext = JsonPath.parse(getClass().getResourceAsStream("/json_array_multiple_delete.json")); + documentContext.delete(deletePath); + List result = documentContext.read(deletePath); + assertThat(result.size()).isEqualTo(0); + } + @Test public void multi_prop_delete() {