From 93a1f893cae18521c6012cc88c0bb086ded3b003 Mon Sep 17 00:00:00 2001 From: Ashish Dhingra <67916761+ashishdhingra@users.noreply.github.com> Date: Fri, 9 Aug 2024 10:17:18 -0700 Subject: [PATCH 1/3] Fixed an issue in JsonSerializer where JsonSerializerSettings.NullValueHandling was being set to NullValueHandling.Ignore after custom settings were applied. --- .../src/Amazon.Lambda.Serialization.Json/JsonSerializer.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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); From c995ed4323e1bf267e08b40929b010219d1c70e4 Mon Sep 17 00:00:00 2001 From: Ashish Dhingra <67916761+ashishdhingra@users.noreply.github.com> Date: Fri, 9 Aug 2024 10:58:05 -0700 Subject: [PATCH 2/3] Added new JsonIncludeNullValueSerializer derived from JsonSerializer that includes null values in serialized JSON. --- .../JsonIncludeNullValueSerializer.cs | 36 +++++++++++++++++++ .../test/EventsTests.Shared/EventTests.cs | 23 ++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 Libraries/src/Amazon.Lambda.Serialization.Json/JsonIncludeNullValueSerializer.cs 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/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; } From 1e37874d2c4069118c6bbae2eb24fcefa0042d8a Mon Sep 17 00:00:00 2001 From: Ashish Dhingra <67916761+ashishdhingra@users.noreply.github.com> Date: Fri, 9 Aug 2024 10:25:13 -0700 Subject: [PATCH 3/3] Version bump Amazon.Lambda.Serialization.Json --- .../Amazon.Lambda.Serialization.Json.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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