diff --git a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java index 29ca08f7bc5..cb4fd614ee2 100644 --- a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java +++ b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java @@ -25,12 +25,13 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.CaseFormat; import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.microsoft.graph.logger.ILogger; - import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -123,7 +124,6 @@ private void setChildAdditionalData(IJsonBackedObject serializedObject, JsonObje // If the object is a HashMap, iterate through its children if (fieldObject instanceof HashMap) { - @SuppressWarnings("unchecked") HashMap serializableChildren = (HashMap) fieldObject; Iterator> it = serializableChildren.entrySet().iterator(); @@ -142,6 +142,21 @@ private void setChildAdditionalData(IJsonBackedObject serializedObject, JsonObje } } } + // If the object is a list of Graph objects, iterate through elements + else if (fieldObject instanceof List && rawJson != null) { + final JsonElement collectionJson = rawJson.get(field.getName()); + final List fieldObjectList = (List) fieldObject; + if (collectionJson.isJsonArray() && ((JsonArray)collectionJson).size() == fieldObjectList.size()) { + final JsonArray rawJsonArray = (JsonArray) collectionJson; + for (int i = 0; i < fieldObjectList.size(); i++) { + final Object element = fieldObjectList.get(i); + if (element instanceof IJsonBackedObject) { + final JsonElement elementRawJson = rawJsonArray.get(i); + setChildAdditionalData((IJsonBackedObject) element, elementRawJson.getAsJsonObject()); + } + } + } + } // If the object is a valid Graph object, set its additional data else if (fieldObject != null && fieldObject instanceof IJsonBackedObject) { IJsonBackedObject serializedChild = (IJsonBackedObject) fieldObject; diff --git a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTests.java b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTests.java index e5590d238f8..6085bc5a5e3 100644 --- a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTests.java +++ b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTests.java @@ -3,8 +3,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.junit.Test; - import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.annotations.Expose; @@ -15,9 +13,11 @@ import com.microsoft.graph.models.extensions.DateOnly; import com.microsoft.graph.models.extensions.Drive; import com.microsoft.graph.models.extensions.FileAttachment; -import com.microsoft.graph.models.extensions.User; import com.microsoft.graph.models.extensions.RecurrenceRange; +import com.microsoft.graph.models.extensions.User; import com.microsoft.graph.models.generated.RecurrenceRangeType; +import com.microsoft.graph.requests.extensions.DriveItemDeltaCollectionResponse; +import org.junit.Test; public class DefaultSerializerTests { @@ -26,7 +26,7 @@ public class DefaultSerializerTests { * * @throws Exception If there is an exception during the test */ - @Test + @Test public void testDriveDeserialization() throws Exception { final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger()); String source = "{\"@odata.context\":\"https://graph.microsoft.com/v1.0/$metadata#drives/$entity\",\"id\":\"8bf6ae90006c4a4c\",\"driveType\":\"personal\",\"owner\":{\"user\":{\"displayName\":\"Peter\",\"id\":\"8bf6ae90006c4a4c\"}},\"quota\":{\"deleted\":1485718314,\"remaining\":983887466461,\"state\":\"normal\",\"total\":1142461300736,\"used\":158573834275}}"; @@ -38,6 +38,43 @@ public void testDriveDeserialization() throws Exception { } + /** + * Make sure that deserializing a DriveItems also deserializes child additionalData + * + * @throws Exception If there is an exception during the test + */ + @Test + public void testDriveItemChildAdditionalDataDeserialization() throws Exception { + final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger()); + String source = "{\n" + + " \"@odata.context\": \"https://graph.microsoft.com/v1.0/$metadata#users('02008492-3fec-4ce4-bb54-980ad856856f')/drive/root/children\",\n" + + " \"value\": [\n" + + " {\n" + + " \"createdBy\": {\n" + + " \"user\": {\n" + + " \"email\": \"the@email.com\",\n" + + " \"id\": \"02008492-3fec-4ce4-bb54-980ad856856f\",\n" + + " \"displayName\": \"John Doe\"\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + "}"; + + DriveItemDeltaCollectionResponse result = serializer + .deserializeObject(source, DriveItemDeltaCollectionResponse.class); + assertNotNull(result); + assertNotNull(result.value); + assertEquals(1, result.value.size()); + assertNotNull(result.value.get(0)); + assertNotNull(result.value.get(0).createdBy); + assertNotNull(result.value.get(0).createdBy.user); + assertNotNull(result.value.get(0).createdBy.user.additionalDataManager()); + assertNotNull(result.value.get(0).createdBy.user.additionalDataManager().get("email")); + assertEquals("the@email.com", + result.value.get(0).createdBy.user.additionalDataManager().get("email").getAsString()); + } + @Test public void testRecurrenceRangeDeserialization() throws Exception { final DefaultSerializer serializer = new DefaultSerializer(new DefaultLogger());