Skip to content

Commit 9744dff

Browse files
Merge pull request #260 from ddellsperger/serialize-nulls
Add support to set a setting to serialize null values
2 parents c55ac30 + d772567 commit 9744dff

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,21 @@ public class DefaultSerializer implements ISerializer {
6565
* @param logger the logger
6666
*/
6767
public DefaultSerializer(@Nonnull final ILogger logger) {
68-
this.logger = Objects.requireNonNull(logger, "parameter logger cannot be null");
69-
this.gson = GsonFactory.getGsonInstance(logger);
68+
this(logger, false);
7069
}
7170

71+
72+
/**
73+
* Creates a DefaultSerializer with an option to enable serializing of the null values.
74+
*
75+
* @param logger the logger
76+
* @param serializeNulls the setting of whether or not to serialize the null values in the JSON object
77+
*/
78+
public DefaultSerializer(@Nonnull final ILogger logger, @Nonnull final boolean serializeNulls) {
79+
this.logger = Objects.requireNonNull(logger, "parameter logger cannot be null");
80+
this.gson = GsonFactory.getGsonInstance(logger, serializeNulls);
81+
}
82+
7283
@Override
7384
@Nullable
7485
public <T> T deserializeObject(@Nonnull final String inputString, @Nonnull final Class<T> clazz, @Nullable final Map<String, List<String>> responseHeaders) {

src/main/java/com/microsoft/graph/serializer/GsonFactory.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@
4444
import java.util.Arrays;
4545
import java.util.EnumSet;
4646
import java.util.GregorianCalendar;
47+
import java.util.Objects;
4748
import java.util.UUID;
4849

50+
import javax.annotation.Nonnull;
4951
import javax.xml.datatype.DatatypeFactory;
5052
import javax.xml.datatype.Duration;
5153

@@ -68,8 +70,21 @@ private GsonFactory() {
6870
* @param logger the logger
6971
* @return the new instance
7072
*/
71-
public static Gson getGsonInstance(final ILogger logger) {
73+
@Nonnull
74+
public static Gson getGsonInstance(@Nonnull final ILogger logger) {
75+
return getGsonInstance(logger, false);
76+
}
7277

78+
/**
79+
* Creates an instance of GSON
80+
*
81+
* @param logger the logger
82+
* @param serializeNulls the setting of whether or not to serialize the null values in the JSON object
83+
* @return the new instance
84+
*/
85+
@Nonnull
86+
public static Gson getGsonInstance(@Nonnull final ILogger logger, final boolean serializeNulls) {
87+
Objects.requireNonNull(logger, "parameter logger cannot be null");
7388
final JsonSerializer<OffsetDateTime> calendarJsonSerializer = new JsonSerializer<OffsetDateTime>() {
7489
@Override
7590
public JsonElement serialize(final OffsetDateTime src,
@@ -328,7 +343,11 @@ public Float deserialize(final JsonElement json,
328343
}
329344
};
330345

331-
return new GsonBuilder()
346+
GsonBuilder builder = new GsonBuilder();
347+
if (serializeNulls) {
348+
builder.serializeNulls();
349+
}
350+
return builder
332351
.excludeFieldsWithoutExposeAnnotation()
333352
.registerTypeAdapter(Boolean.class, booleanJsonDeserializer)
334353
.registerTypeAdapter(String.class, stringJsonDeserializer)

src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import com.google.gson.Gson;
44
import com.google.gson.JsonElement;
55
import com.microsoft.graph.logger.ILogger;
6+
import com.microsoft.graph.models.MessageStub;
67
import com.microsoft.graph.models.ReactionStub;
78
import com.microsoft.graph.models.SubReactionStub1;
89
import org.junit.jupiter.api.Test;
910
import org.mockito.Mockito;
1011

1112
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1214
import static org.junit.jupiter.api.Assertions.assertTrue;
1315
import static org.mockito.Mockito.mock;
1416

@@ -33,4 +35,33 @@ public void testDeserializationOfObjectWithODataTypeProperty() {
3335
Mockito.verify(reaction.additionalDataManager()).setAdditionalData(gson.fromJson(testJsonResponse, JsonElement.class).getAsJsonObject());
3436
}
3537

38+
@Test
39+
public void testDefaultSerializerDoesNotIncludeNullValuesByDefault() {
40+
// Given
41+
final String testJsonResponse =
42+
"{\"@odata.type\": \"#microsoft.graph.messageStub\", \"body\": null}";
43+
44+
// When
45+
final MessageStub message = defaultSerializer.deserializeObject(testJsonResponse, MessageStub.class);
46+
47+
// Then
48+
assertNotNull(message);
49+
assertEquals("{}", defaultSerializer.serializeObject(message));
50+
}
51+
52+
@Test
53+
public void testDefaultNullSerializerDoesIncludeNullValues() {
54+
// Given
55+
final String testJsonResponse =
56+
"{\"@odata.type\": \"#microsoft.graph.messageStub\",\"body\":null}";
57+
58+
// When
59+
final DefaultSerializer nullSerializer = new DefaultSerializer(logger, true);
60+
final MessageStub message = nullSerializer.deserializeObject(testJsonResponse, MessageStub.class);
61+
62+
// Then
63+
assertNotNull(message);
64+
assertEquals("{\"body\":null,\"reaction\":null}", nullSerializer.serializeObject(message));
65+
}
66+
3667
}

0 commit comments

Comments
 (0)