diff --git a/CHANGELOG.md b/CHANGELOG.md index 46b8c3b8b..ced4410b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +## [1.1.3] - 2024-04-02 + +### Changed + +- Fixes a bug in the seriliazer that would `IllegalStateException` for json arrays in the additional data. + ## [1.1.2] - 2024-03-26 ### Changed diff --git a/components/serialization/json/src/main/java/com/microsoft/kiota/serialization/JsonParseNode.java b/components/serialization/json/src/main/java/com/microsoft/kiota/serialization/JsonParseNode.java index 06a94ab5a..771650ba1 100644 --- a/components/serialization/json/src/main/java/com/microsoft/kiota/serialization/JsonParseNode.java +++ b/components/serialization/json/src/main/java/com/microsoft/kiota/serialization/JsonParseNode.java @@ -163,8 +163,8 @@ public JsonParseNode(@Nonnull final JsonElement node) { } } - private List iterateOnArray(Function fn) { - JsonArray array = currentNode.getAsJsonArray(); + private List iterateOnArray(JsonElement jsonElement, Function fn) { + JsonArray array = jsonElement.getAsJsonArray(); final Iterator sourceIterator = array.iterator(); final List result = new ArrayList<>(); while (sourceIterator.hasNext()) { @@ -182,7 +182,8 @@ private List iterateOnArray(Function fn) { if (currentNode.isJsonNull()) { return null; } else if (currentNode.isJsonArray()) { - return iterateOnArray(itemNode -> getPrimitiveValue(targetClass, itemNode)); + return iterateOnArray( + currentNode, itemNode -> getPrimitiveValue(targetClass, itemNode)); } else throw new RuntimeException("invalid state expected to have an array node"); } @@ -192,7 +193,7 @@ private List iterateOnArray(Function fn) { if (currentNode.isJsonNull()) { return null; } else if (currentNode.isJsonArray()) { - return iterateOnArray(itemNode -> itemNode.getObjectValue(factory)); + return iterateOnArray(currentNode, itemNode -> itemNode.getObjectValue(factory)); } else return null; } @@ -202,7 +203,7 @@ private List iterateOnArray(Function fn) { if (currentNode.isJsonNull()) { return null; } else if (currentNode.isJsonArray()) { - return iterateOnArray(itemNode -> itemNode.getEnumValue(enumParser)); + return iterateOnArray(currentNode, itemNode -> itemNode.getEnumValue(enumParser)); } else throw new RuntimeException("invalid state expected to have an array node"); } @@ -242,7 +243,7 @@ else if (element.isJsonPrimitive()) { return new UntypedObject(propertiesMap); } else if (element.isJsonArray()) { - return new UntypedArray(iterateOnArray(JsonParseNode::getUntypedValue)); + return new UntypedArray(iterateOnArray(element, JsonParseNode::getUntypedValue)); } throw new RuntimeException( diff --git a/components/serialization/json/src/test/java/com/microsoft/kiota/serialization/JsonParseNodeTests.java b/components/serialization/json/src/test/java/com/microsoft/kiota/serialization/JsonParseNodeTests.java index 80464cbc2..bbd3cf694 100644 --- a/components/serialization/json/src/test/java/com/microsoft/kiota/serialization/JsonParseNodeTests.java +++ b/components/serialization/json/src/test/java/com/microsoft/kiota/serialization/JsonParseNodeTests.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import com.google.gson.JsonParser; +import com.microsoft.kiota.serialization.mocks.TestEntity; import com.microsoft.kiota.serialization.mocks.UntypedTestEntity; import org.junit.jupiter.api.Test; @@ -16,6 +17,10 @@ class JsonParseNodeTests { private static final JsonParseNodeFactory _parseNodeFactory = new JsonParseNodeFactory(); private static final String contentType = "application/json"; + + private static final String testJsonString = + "{\"displayName\":\"My Group\",\"id\":\"11111111-1111-1111-1111-111111111111" + + "\",\"members@delta\":[{\"@odata.type\":\"#microsoft.graph.user\",\"id\":\"22222222-2222-2222-2222-222222222222\"}]}"; private static final String testUntypedJson = "{\r\n" + " \"@odata.context\":" @@ -95,6 +100,17 @@ void testInvalidOffsetDateTimeStringThrowsException(final String dateTimeString) } } + @Test + void getEntityWithArrayInAdditionalData() throws UnsupportedEncodingException { + final var rawResponse = new ByteArrayInputStream(testJsonString.getBytes("UTF-8")); + final var parseNode = _parseNodeFactory.getParseNode(contentType, rawResponse); + // Act + var entity = parseNode.getObjectValue(TestEntity::createFromDiscriminatorValue); + assertEquals("11111111-1111-1111-1111-111111111111", entity.getId()); + final var arrayValue = (UntypedArray) entity.getAdditionalData().get("members@delta"); + assertEquals(1, arrayValue.getValue().spliterator().estimateSize()); + } + @Test void GetEntityWithUntypedNodesFromJson() throws UnsupportedEncodingException { final var rawResponse = new ByteArrayInputStream(testUntypedJson.getBytes("UTF-8")); diff --git a/gradle.properties b/gradle.properties index 5be5fc750..8cb2e80e0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,7 +26,7 @@ org.gradle.caching=true mavenGroupId = com.microsoft.kiota mavenMajorVersion = 1 mavenMinorVersion = 1 -mavenPatchVersion = 2 +mavenPatchVersion = 3 mavenArtifactSuffix = #These values are used to run functional tests