From 2a28dcc544347c325c4bfe018aa6d775f549b858 Mon Sep 17 00:00:00 2001 From: TylerBrinkley Date: Tue, 18 Oct 2016 11:34:43 -0500 Subject: [PATCH 1/2] Stops including the typename for nullable structs using TypeNameHandling.Auto, fixes #1050 --- .../Serialization/TypeNameHandlingTests.cs | 41 +++++++++++++++++++ .../JsonSerializerInternalWriter.cs | 6 +-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs index fb901669..db0c5ccb 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs @@ -1934,9 +1934,50 @@ namespace Newtonsoft.Json.Tests.Serialization Assert.IsNotNull(obtainedDictionary); } + + [Test] + public void SerializeNullableStructProperty_Auto() + { + ObjectWithOptionalMessage objWithMessage = new ObjectWithOptionalMessage(new Message2("Hello!")); + + JsonSerializerSettings serializerSettings = new JsonSerializerSettings + { + TypeNameHandling = TypeNameHandling.Auto, + Formatting = Formatting.Indented + }; + + StringAssert.AreEqual(@"{ + ""Message"": { + ""Value"": ""Hello!"" + } +}", JsonConvert.SerializeObject(objWithMessage, serializerSettings)); + } #endif } + public struct Message2 + { + public string Value { get; } + + [JsonConstructor] + public Message2(string value) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + + Value = value; + } + } + + public class ObjectWithOptionalMessage + { + public Message2? Message { get; } + + public ObjectWithOptionalMessage(Message2? message) + { + Message = message; + } + } + public class DataType { public DataType() diff --git a/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalWriter.cs b/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalWriter.cs index 6f2679e9..528375f2 100644 --- a/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalWriter.cs +++ b/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalWriter.cs @@ -1002,14 +1002,14 @@ namespace Newtonsoft.Json.Serialization { if (member != null) { - if (contract.UnderlyingType != member.PropertyContract.CreatedType) + if (contract.NonNullableUnderlyingType != member.PropertyContract.CreatedType) { return true; } } else if (containerContract != null) { - if (containerContract.ItemContract == null || contract.UnderlyingType != containerContract.ItemContract.CreatedType) + if (containerContract.ItemContract == null || contract.NonNullableUnderlyingType != containerContract.ItemContract.CreatedType) { return true; } @@ -1018,7 +1018,7 @@ namespace Newtonsoft.Json.Serialization { JsonContract rootContract = Serializer._contractResolver.ResolveContract(_rootType); - if (contract.UnderlyingType != rootContract.CreatedType) + if (contract.NonNullableUnderlyingType != rootContract.CreatedType) { return true; } From 53278cbe573cba389bcbd85455662e2e59ee8e72 Mon Sep 17 00:00:00 2001 From: TylerBrinkley Date: Tue, 18 Oct 2016 12:05:49 -0500 Subject: [PATCH 2/2] Added deserialization test and cleaned up the tests --- .../Serialization/TypeNameHandlingTests.cs | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs index db0c5ccb..8101c5f8 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs @@ -1938,19 +1938,40 @@ namespace Newtonsoft.Json.Tests.Serialization [Test] public void SerializeNullableStructProperty_Auto() { - ObjectWithOptionalMessage objWithMessage = new ObjectWithOptionalMessage(new Message2("Hello!")); - JsonSerializerSettings serializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, Formatting = Formatting.Indented }; + ObjectWithOptionalMessage objWithMessage = new ObjectWithOptionalMessage(new Message2("Hello!")); + + string json = JsonConvert.SerializeObject(objWithMessage, serializerSettings); + StringAssert.AreEqual(@"{ ""Message"": { ""Value"": ""Hello!"" } -}", JsonConvert.SerializeObject(objWithMessage, serializerSettings)); +}", json); + } + + [Test] + public void DeserializeNullableStructProperty_Auto() + { + JsonSerializerSettings serializerSettings = new JsonSerializerSettings + { + TypeNameHandling = TypeNameHandling.Auto, + Formatting = Formatting.Indented + }; + + string json = @"{ + ""Message"": { + ""Value"": ""Hello!"" + } +}"; + ObjectWithOptionalMessage objWithMessage = JsonConvert.DeserializeObject(json, serializerSettings); + + StringAssert.AreEqual("Hello!", objWithMessage.Message.Value.Value); } #endif }