-Changed empty string to be deserialized as null for nullable types
This commit is contained in:
@@ -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" />
|
||||
|
||||
+1
-1
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user