diff --git a/JsonSubTypes.Tests/DatesTests.cs b/JsonSubTypes.Tests/DatesTests.cs new file mode 100644 index 0000000..65c6c35 --- /dev/null +++ b/JsonSubTypes.Tests/DatesTests.cs @@ -0,0 +1,36 @@ +using System; +using Newtonsoft.Json; +using NUnit.Framework; + +namespace JsonSubTypes.Tests +{ + [TestFixture] + public class DatesTest + { + [JsonConverter(typeof(JsonSubtypes), nameof(SubTypeClass.Discriminator))] + [JsonSubtypes.KnownSubType(typeof(SubTypeClass), "SubTypeClass")] + public abstract class MainClass + { + } + + public class SubTypeClass : MainClass + { + public string Discriminator => "SubTypeClass"; + + public DateTimeOffset? Date { get; set; } + } + + [Test] + public void DeserializingSubTypeWithDateParsesCorrectly() + { + var json = "{ \"Discriminator\": \"SubTypeClass\", \"Date\": \"2020-06-28T00:00:00.00000+00:00\" }"; + + var obj = JsonConvert.DeserializeObject(json); + + Assert.That(obj, Is.Not.Null); + Assert.That(obj, Is.InstanceOf()); + Assert.That(((SubTypeClass)obj).Date.HasValue, Is.True); + Assert.That(((SubTypeClass)obj).Date.Value.Offset, Is.EqualTo(TimeSpan.Zero)); + } + } +} diff --git a/JsonSubTypes/JsonSubtypes.cs b/JsonSubTypes/JsonSubtypes.cs index 296d302..c4f6cec 100644 --- a/JsonSubTypes/JsonSubtypes.cs +++ b/JsonSubTypes/JsonSubtypes.cs @@ -201,7 +201,12 @@ private static Type GetElementType(Type arrayOrGenericContainer) private object ReadObject(JsonReader reader, Type objectType, JsonSerializer serializer) { + // I would prefer to create a new reader, but can't work out how to + // This seems a reasonable alternative - https://github.com/JamesNK/Newtonsoft.Json/issues/1605#issuecomment-602673364 + var savedDateParseSettings = reader.DateParseHandling; + reader.DateParseHandling = DateParseHandling.None; var jObject = JObject.Load(reader); + reader.DateParseHandling = savedDateParseSettings; var targetType = GetType(jObject, objectType, serializer) ?? objectType;