-Changed empty string to be deserialized as null for nullable types

This commit is contained in:
JamesNK
2009-08-06 08:52:00 +00:00
parent ff5c48660d
commit 5167415f47
9 changed files with 36 additions and 6 deletions
@@ -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<NullableDateTimeTestClass>(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()
@@ -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<NullableDateTimeTestClass>(json);
Assert.AreEqual(null, c.DateTimeField);
}
}
}
@@ -98,6 +98,7 @@
<Compile Include="TestObjects\MethodExecutorObject.cs" />
<Compile Include="TestObjects\MyClass.cs" />
<Compile Include="TestObjects\Name.cs" />
<Compile Include="TestObjects\NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\PersonRaw.cs" />
<Compile Include="TestObjects\PhoneNumber.cs" />
<Compile Include="TestObjects\PrivateMembersClass.cs" />
@@ -127,7 +128,6 @@
<Compile Include="Schema\JsonSchemaGeneratorTests.cs" />
<Compile Include="Schema\JsonSchemaTests.cs" />
<Compile Include="JsonRawTests.cs" />
<Compile Include="NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\DateTimeTestClass.cs" />
<Compile Include="Converters\IsoDateTimeConverterTests.cs" />
<Compile Include="JsonConvertTest.cs" />
@@ -102,6 +102,7 @@
<Compile Include="TestObjects\JaggedArray.cs" />
<Compile Include="TestObjects\MyClass.cs" />
<Compile Include="TestObjects\Name.cs" />
<Compile Include="TestObjects\NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\PersonRaw.cs" />
<Compile Include="TestObjects\PhoneNumber.cs" />
<Compile Include="TestObjects\PrivateMembersClass.cs" />
@@ -131,7 +132,6 @@
<Compile Include="Schema\JsonSchemaGeneratorTests.cs" />
<Compile Include="Schema\JsonSchemaTests.cs" />
<Compile Include="JsonRawTests.cs" />
<Compile Include="NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\DateTimeTestClass.cs" />
<Compile Include="Converters\IsoDateTimeConverterTests.cs" />
<Compile Include="JsonConvertTest.cs" />
@@ -104,6 +104,7 @@
<Compile Include="TestObjects\MethodExecutorObject.cs" />
<Compile Include="TestObjects\MyClass.cs" />
<Compile Include="TestObjects\Name.cs" />
<Compile Include="TestObjects\NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\PersonRaw.cs" />
<Compile Include="TestObjects\PhoneNumber.cs" />
<Compile Include="TestObjects\PrivateMembersClass.cs" />
@@ -133,7 +134,6 @@
<Compile Include="Schema\JsonSchemaGeneratorTests.cs" />
<Compile Include="Schema\JsonSchemaTests.cs" />
<Compile Include="JsonRawTests.cs" />
<Compile Include="NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\DateTimeTestClass.cs" />
<Compile Include="Converters\IsoDateTimeConverterTests.cs" />
<Compile Include="JsonConvertTest.cs" />
@@ -168,7 +168,7 @@
<Compile Include="Schema\JsonSchemaGeneratorTests.cs" />
<Compile Include="Schema\JsonSchemaTests.cs" />
<Compile Include="JsonRawTests.cs" />
<Compile Include="NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\NullableDateTimeTestClass.cs" />
<Compile Include="TestObjects\DateTimeTestClass.cs" />
<Compile Include="Converters\IsoDateTimeConverterTests.cs" />
<Compile Include="JsonConvertTest.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
{
@@ -94,7 +94,8 @@ namespace Newtonsoft.Json.Converters
/// <returns>The object value.</returns>
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))
@@ -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: