From 9ae751fd4db42156afe6f9b5dcf0246c311a26c7 Mon Sep 17 00:00:00 2001 From: Lee Sang Gyu Date: Wed, 4 Nov 2026 23:44:46 +0900 Subject: [PATCH 1/2] Fix negative index selecting the first element in sequence functions --- .../internal/function/sequence/AbstractSequenceAggregation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java b/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java index 24c87e13..741b4261 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java @@ -30,7 +30,7 @@ public Object invoke(String currentPath, PathRef parent, Object model, Evaluatio return objectList.get(targetIndex); } else { int realIndex = objectList.size() + targetIndex; - if (realIndex > 0) { + if (realIndex >= 0) { return objectList.get(realIndex); } else { throw new JsonPathException("Target index:" + targetIndex + " larger than object count:" + objectList.size()); From 1e1366c9e3582649d7fc1e2f4965e822d34fbd41 Mon Sep 17 00:00:00 2001 From: Lee Sang Gyu Date: Wed, 4 Nov 2026 23:45:14 +0900 Subject: [PATCH 2/2] Add sequence boundary tests --- .../function/SequenceBoundaryTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 json-path/src/test/java/com/jayway/jsonpath/internal/function/SequenceBoundaryTest.java diff --git a/json-path/src/test/java/com/jayway/jsonpath/internal/function/SequenceBoundaryTest.java b/json-path/src/test/java/com/jayway/jsonpath/internal/function/SequenceBoundaryTest.java new file mode 100644 index 00000000..a53adce6 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/function/SequenceBoundaryTest.java @@ -0,0 +1,28 @@ +package com.jayway.jsonpath.internal.function; + +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.JsonPathException; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class SequenceBoundaryTest { + @Test + void lastOfSingleton() { + Object result = JsonPath.read("[42]", "$.last()"); + assertThat(result).isEqualTo(42); + } + + @Test + void negativeIndexCanSelectFirstElement() { + Object result = JsonPath.read("[1,2,3]", "$.index(-3)"); + assertThat(result).isEqualTo(1); + } + + @Test + void negativeIndexBeforeStartStillFails() { + assertThatThrownBy(() -> JsonPath.read("[1,2,3]", "$.index(-4)")) + .isInstanceOf(JsonPathException.class); + } +}