diff --git a/src/main/java/io/lettuce/core/json/DelegateJsonArray.java b/src/main/java/io/lettuce/core/json/DelegateJsonArray.java index 7273abd2c..8ceacd5d0 100644 --- a/src/main/java/io/lettuce/core/json/DelegateJsonArray.java +++ b/src/main/java/io/lettuce/core/json/DelegateJsonArray.java @@ -59,7 +59,7 @@ public List asList() { List result = new ArrayList<>(); for (JsonNode jsonNode : node) { - result.add(new DelegateJsonValue(jsonNode, objectMapper)); + result.add(wrap(jsonNode, objectMapper)); } return result; diff --git a/src/test/java/io/lettuce/core/json/DelegateJsonArrayUnitTests.java b/src/test/java/io/lettuce/core/json/DelegateJsonArrayUnitTests.java index 197008e47..b888e03cb 100644 --- a/src/test/java/io/lettuce/core/json/DelegateJsonArrayUnitTests.java +++ b/src/test/java/io/lettuce/core/json/DelegateJsonArrayUnitTests.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import java.util.Iterator; +import java.util.List; import static io.lettuce.TestTags.UNIT_TEST; import static org.assertj.core.api.Assertions.assertThat; @@ -187,4 +188,68 @@ void asAnythingElse() { assertThat(underTest.asNumber()).isNull(); } + @Test + void asListWithNestedObjects() { + ObjectMapper objectMapper = new ObjectMapper(); + DefaultJsonParser parser = new DefaultJsonParser(objectMapper); + + // Create an array containing nested objects + DelegateJsonArray underTest = new DelegateJsonArray(objectMapper); + underTest.add(parser.createJsonValue("{\"name\": \"Alice\", \"age\": 30}")); + underTest.add(parser.createJsonValue("{\"name\": \"Bob\", \"age\": 25}")); + + // Test that asList() returns proper DelegateJsonObject instances for nested objects + List list = underTest.asList(); + assertThat(list).hasSize(2); + + // Verify that elements from asList() behave consistently with get() + for (int i = 0; i < list.size(); i++) { + JsonValue listElement = list.get(i); + JsonValue getElement = underTest.get(i); + + // Both should be DelegateJsonObject instances + assertThat(listElement.isJsonObject()).isTrue(); + assertThat(getElement.isJsonObject()).isTrue(); + + // Both should have the same behavior + assertThat(listElement.asJsonObject()).isNotNull(); + assertThat(getElement.asJsonObject()).isNotNull(); + + // Both should return the same string representation + assertThat(listElement.toString()).isEqualTo(getElement.toString()); + } + } + + @Test + void asListWithNestedArrays() { + ObjectMapper objectMapper = new ObjectMapper(); + DefaultJsonParser parser = new DefaultJsonParser(objectMapper); + + // Create an array containing nested arrays + DelegateJsonArray underTest = new DelegateJsonArray(objectMapper); + underTest.add(parser.createJsonValue("[1, 2, 3]")); + underTest.add(parser.createJsonValue("[\"a\", \"b\", \"c\"]")); + + // Test that asList() returns proper DelegateJsonArray instances for nested arrays + List list = underTest.asList(); + assertThat(list).hasSize(2); + + // Verify that elements from asList() behave consistently with get() + for (int i = 0; i < list.size(); i++) { + JsonValue listElement = list.get(i); + JsonValue getElement = underTest.get(i); + + // Both should be DelegateJsonArray instances + assertThat(listElement.isJsonArray()).isTrue(); + assertThat(getElement.isJsonArray()).isTrue(); + + // Both should have the same behavior + assertThat(listElement.asJsonArray()).isNotNull(); + assertThat(getElement.asJsonArray()).isNotNull(); + + // Both should return the same string representation + assertThat(listElement.toString()).isEqualTo(getElement.toString()); + } + } + }