diff --git a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java index 3ea6cf36d..5b510482d 100644 --- a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java +++ b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java @@ -65,10 +65,21 @@ public class DefaultSerializer implements ISerializer { * @param logger the logger */ public DefaultSerializer(@Nonnull final ILogger logger) { - this.logger = Objects.requireNonNull(logger, "parameter logger cannot be null"); - this.gson = GsonFactory.getGsonInstance(logger); + this(logger, false); } + + /** + * Creates a DefaultSerializer with an option to enable serializing of the null values. + * + * @param logger the logger + * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object + */ + public DefaultSerializer(@Nonnull final ILogger logger, @Nonnull final boolean serializeNulls) { + this.logger = Objects.requireNonNull(logger, "parameter logger cannot be null"); + this.gson = GsonFactory.getGsonInstance(logger, serializeNulls); + } + @Override @Nullable public T deserializeObject(@Nonnull final String inputString, @Nonnull final Class clazz, @Nullable final Map> responseHeaders) { diff --git a/src/main/java/com/microsoft/graph/serializer/GsonFactory.java b/src/main/java/com/microsoft/graph/serializer/GsonFactory.java index 1b24e1c08..645766f55 100644 --- a/src/main/java/com/microsoft/graph/serializer/GsonFactory.java +++ b/src/main/java/com/microsoft/graph/serializer/GsonFactory.java @@ -44,8 +44,10 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.GregorianCalendar; +import java.util.Objects; import java.util.UUID; +import javax.annotation.Nonnull; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; @@ -68,8 +70,21 @@ private GsonFactory() { * @param logger the logger * @return the new instance */ - public static Gson getGsonInstance(final ILogger logger) { + @Nonnull + public static Gson getGsonInstance(@Nonnull final ILogger logger) { + return getGsonInstance(logger, false); + } + /** + * Creates an instance of GSON + * + * @param logger the logger + * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object + * @return the new instance + */ + @Nonnull + public static Gson getGsonInstance(@Nonnull final ILogger logger, final boolean serializeNulls) { + Objects.requireNonNull(logger, "parameter logger cannot be null"); final JsonSerializer calendarJsonSerializer = new JsonSerializer() { @Override public JsonElement serialize(final OffsetDateTime src, @@ -328,7 +343,11 @@ public Float deserialize(final JsonElement json, } }; - return new GsonBuilder() + GsonBuilder builder = new GsonBuilder(); + if (serializeNulls) { + builder.serializeNulls(); + } + return builder .excludeFieldsWithoutExposeAnnotation() .registerTypeAdapter(Boolean.class, booleanJsonDeserializer) .registerTypeAdapter(String.class, stringJsonDeserializer) diff --git a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java index 459e9b14a..de269d613 100644 --- a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java +++ b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java @@ -3,12 +3,14 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.microsoft.graph.logger.ILogger; +import com.microsoft.graph.models.MessageStub; import com.microsoft.graph.models.ReactionStub; import com.microsoft.graph.models.SubReactionStub1; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; @@ -33,4 +35,33 @@ public void testDeserializationOfObjectWithODataTypeProperty() { Mockito.verify(reaction.additionalDataManager()).setAdditionalData(gson.fromJson(testJsonResponse, JsonElement.class).getAsJsonObject()); } + @Test + public void testDefaultSerializerDoesNotIncludeNullValuesByDefault() { + // Given + final String testJsonResponse = + "{\"@odata.type\": \"#microsoft.graph.messageStub\", \"body\": null}"; + + // When + final MessageStub message = defaultSerializer.deserializeObject(testJsonResponse, MessageStub.class); + + // Then + assertNotNull(message); + assertEquals("{}", defaultSerializer.serializeObject(message)); + } + + @Test + public void testDefaultNullSerializerDoesIncludeNullValues() { + // Given + final String testJsonResponse = + "{\"@odata.type\": \"#microsoft.graph.messageStub\",\"body\":null}"; + + // When + final DefaultSerializer nullSerializer = new DefaultSerializer(logger, true); + final MessageStub message = nullSerializer.deserializeObject(testJsonResponse, MessageStub.class); + + // Then + assertNotNull(message); + assertEquals("{\"body\":null,\"reaction\":null}", nullSerializer.serializeObject(message)); + } + }