From 5167415f47925780da1ff15ea257711413b90ad5 Mon Sep 17 00:00:00 2001 From: JamesNK Date: Thu, 6 Aug 2009 08:52:00 +0000 Subject: [PATCH] -Changed empty string to be deserialized as null for nullable types --- .../Converters/IsoDateTimeConverterTests.cs | 10 ++++++++++ Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs | 9 +++++++++ .../Newtonsoft.Json.Tests.Compact.csproj | 2 +- .../Newtonsoft.Json.Tests.Net20.csproj | 2 +- .../Newtonsoft.Json.Tests.Silverlight.csproj | 2 +- Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj | 2 +- .../{ => TestObjects}/NullableDateTimeTestClass.cs | 2 +- Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs | 6 +++++- .../Serialization/JsonSerializerReader.cs | 7 +++++++ 9 files changed, 36 insertions(+), 6 deletions(-) rename Src/Newtonsoft.Json.Tests/{ => TestObjects}/NullableDateTimeTestClass.cs (94%) diff --git a/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs index 33b3babf..351f0cae 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs @@ -236,6 +236,16 @@ namespace Newtonsoft.Json.Tests.Converters Assert.AreEqual("Post", c2.PostField); } + [Test] + public void NullableDeserializeEmptyString() + { + string json = @"{""DateTimeField"":""""}"; + + NullableDateTimeTestClass c = JsonConvert.DeserializeObject(json, + new JsonSerializerSettings { Converters = new [] {new IsoDateTimeConverter()}}); + Assert.AreEqual(null, c.DateTimeField); + } + [Test] [ExpectedException(typeof(Exception), ExpectedMessage = "Cannot convert null value to System.DateTime.")] public void DeserializeNullToNonNullable() diff --git a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs index 00c2f086..25af25e3 100644 --- a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs @@ -2040,5 +2040,14 @@ keyword such as type of business."" Assert.AreEqual(2, products.Count); Assert.AreEqual("Product 1", products[0].Name); } + + [Test] + public void DeserializeEmptyStringToNullableDateTime() + { + string json = @"{""DateTimeField"":""""}"; + + NullableDateTimeTestClass c = JsonConvert.DeserializeObject(json); + Assert.AreEqual(null, c.DateTimeField); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj index c7957baf..8ee9bfa3 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj @@ -98,6 +98,7 @@ + @@ -127,7 +128,6 @@ - diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj index bf45f0a2..bfa1091a 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj @@ -102,6 +102,7 @@ + @@ -131,7 +132,6 @@ - diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj index e644b76d..5d92e233 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj @@ -104,6 +104,7 @@ + @@ -133,7 +134,6 @@ - diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj index cd129eae..41b72e8b 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj @@ -168,7 +168,7 @@ - + diff --git a/Src/Newtonsoft.Json.Tests/NullableDateTimeTestClass.cs b/Src/Newtonsoft.Json.Tests/TestObjects/NullableDateTimeTestClass.cs similarity index 94% rename from Src/Newtonsoft.Json.Tests/NullableDateTimeTestClass.cs rename to Src/Newtonsoft.Json.Tests/TestObjects/NullableDateTimeTestClass.cs index e619d38b..118b4f5c 100644 --- a/Src/Newtonsoft.Json.Tests/NullableDateTimeTestClass.cs +++ b/Src/Newtonsoft.Json.Tests/TestObjects/NullableDateTimeTestClass.cs @@ -28,7 +28,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -namespace Newtonsoft.Json.Tests +namespace Newtonsoft.Json.Tests.TestObjects { public class NullableDateTimeTestClass { diff --git a/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs b/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs index c9aed913..b03e7d87 100644 --- a/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs @@ -94,7 +94,8 @@ namespace Newtonsoft.Json.Converters /// The object value. public override object ReadJson(JsonReader reader, Type objectType, JsonSerializer serializer) { - Type t = (ReflectionUtils.IsNullableType(objectType)) + bool nullable = ReflectionUtils.IsNullableType(objectType); + Type t = (nullable) ? Nullable.GetUnderlyingType(objectType) : objectType; @@ -111,6 +112,9 @@ namespace Newtonsoft.Json.Converters string dateText = reader.Value.ToString(); + if (string.IsNullOrEmpty(dateText) && nullable) + return null; + if (t == typeof(DateTimeOffset)) { if (!string.IsNullOrEmpty(_dateTimeFormat)) diff --git a/Src/Newtonsoft.Json/Serialization/JsonSerializerReader.cs b/Src/Newtonsoft.Json/Serialization/JsonSerializerReader.cs index 0f7d2ad8..c55cb05a 100644 --- a/Src/Newtonsoft.Json/Serialization/JsonSerializerReader.cs +++ b/Src/Newtonsoft.Json/Serialization/JsonSerializerReader.cs @@ -169,6 +169,13 @@ namespace Newtonsoft.Json.Serialization case JsonToken.String: case JsonToken.Boolean: case JsonToken.Date: + // convert empty string to null automatically + if (reader.Value is string && + string.IsNullOrEmpty((string)reader.Value) && + objectType != null && + ReflectionUtils.IsNullable(objectType)) + return null; + return EnsureType(reader.Value, objectType); case JsonToken.StartConstructor: case JsonToken.EndConstructor: