diff --git a/Libraries/src/Amazon.Lambda.Serialization.Json/Amazon.Lambda.Serialization.Json.csproj b/Libraries/src/Amazon.Lambda.Serialization.Json/Amazon.Lambda.Serialization.Json.csproj
index 9fba046a4..1090ea808 100644
--- a/Libraries/src/Amazon.Lambda.Serialization.Json/Amazon.Lambda.Serialization.Json.csproj
+++ b/Libraries/src/Amazon.Lambda.Serialization.Json/Amazon.Lambda.Serialization.Json.csproj
@@ -9,7 +9,7 @@
Amazon.Lambda.Serialization.Json
Amazon.Lambda.Serialization.Json
AWS;Amazon;Lambda
- 2.2.2
+ 2.2.3
diff --git a/Libraries/src/Amazon.Lambda.Serialization.Json/JsonIncludeNullValueSerializer.cs b/Libraries/src/Amazon.Lambda.Serialization.Json/JsonIncludeNullValueSerializer.cs
new file mode 100644
index 000000000..f08f0080c
--- /dev/null
+++ b/Libraries/src/Amazon.Lambda.Serialization.Json/JsonIncludeNullValueSerializer.cs
@@ -0,0 +1,36 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using Amazon.Lambda.Core;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+
+namespace Amazon.Lambda.Serialization.Json
+{
+ ///
+ /// Custom ILambdaSerializer implementation which uses Newtonsoft.Json
+ /// for serialization that includes null values.
+ ///
+ ///
+ /// If the environment variable LAMBDA_NET_SERIALIZER_DEBUG is set to true the JSON coming
+ /// in from Lambda and being sent back to Lambda will be logged.
+ ///
+ ///
+ public class JsonIncludeNullValueSerializer : JsonSerializer
+ {
+ ///
+ /// Constructs instance of serializer.
+ ///
+ public JsonIncludeNullValueSerializer()
+ : base(CreateCustomizer())
+ { }
+
+ private static Action CreateCustomizer()
+ {
+ return (JsonSerializerSettings customSerializerSettings) =>
+ {
+ customSerializerSettings.NullValueHandling = NullValueHandling.Include;
+ };
+ }
+ }
+}
diff --git a/Libraries/src/Amazon.Lambda.Serialization.Json/JsonSerializer.cs b/Libraries/src/Amazon.Lambda.Serialization.Json/JsonSerializer.cs
index 4d73f7345..77c23e1e6 100644
--- a/Libraries/src/Amazon.Lambda.Serialization.Json/JsonSerializer.cs
+++ b/Libraries/src/Amazon.Lambda.Serialization.Json/JsonSerializer.cs
@@ -8,7 +8,7 @@
namespace Amazon.Lambda.Serialization.Json
{
///
- /// Custom ILambdaSerializer implementation which uses Newtonsoft.Json 9.0.1
+ /// Custom ILambdaSerializer implementation which uses Newtonsoft.Json
/// for serialization.
///
///
@@ -41,8 +41,8 @@ public JsonSerializer(Action customizeSerializerSettings
public JsonSerializer(Action customizeSerializerSettings, NamingStrategy namingStrategy)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
+ settings.NullValueHandling = NullValueHandling.Ignore;
customizeSerializerSettings(settings);
-
// Set the contract resolver *after* the custom callback has been
// invoked. This makes sure that we always use the good resolver.
@@ -52,7 +52,6 @@ public JsonSerializer(Action customizeSerializerSettings
resolver.NamingStrategy = namingStrategy;
};
settings.ContractResolver = resolver;
- settings.NullValueHandling = NullValueHandling.Ignore;
serializer = Newtonsoft.Json.JsonSerializer.Create(settings);
diff --git a/Libraries/test/EventsTests.Shared/EventTests.cs b/Libraries/test/EventsTests.Shared/EventTests.cs
index e5604b741..66bb088fe 100644
--- a/Libraries/test/EventsTests.Shared/EventTests.cs
+++ b/Libraries/test/EventsTests.Shared/EventTests.cs
@@ -23,6 +23,7 @@ namespace Amazon.Lambda.Tests
using Amazon.Lambda.LexV2Events;
using Amazon.Lambda.MQEvents;
using Amazon.Lambda.S3Events;
+ using Amazon.Lambda.Serialization.Json;
using Amazon.Lambda.SimpleEmailEvents;
using Amazon.Lambda.SNSEvents;
using Amazon.Lambda.SQSEvents;
@@ -3879,6 +3880,28 @@ public void CloudWatchTranslateParallelDataStateChangeUpdate(Type serializerType
}
}
+
+ [Fact]
+ public void TestJsonIncludeNullValueSerializer()
+ {
+ var serializer = new JsonIncludeNullValueSerializer();
+
+ var response = new ClassUsingPascalCase
+ {
+ SomeValue = 123,
+ SomeOtherValue = null
+ };
+
+ MemoryStream ms = new MemoryStream();
+ serializer.Serialize(response, ms);
+ ms.Position = 0;
+ var json = new StreamReader(ms).ReadToEnd();
+
+ var serialized = JObject.Parse(json);
+ Assert.Equal(123, serialized["SomeValue"]);
+ Assert.Equal(JTokenType.Null, serialized["SomeOtherValue"].Type); // System.NullReferenceException is thrown if value is missing.
+ }
+
class ClassUsingPascalCase
{
public int SomeValue { get; set; }