From b04b594c3898877dbb25d573afb9a1f8e6189484 Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Sat, 5 Apr 2014 20:15:34 -0400 Subject: [PATCH 1/2] Add failing test for deserializing DateTimeOffset Causes an InvalidCastException in the IsoDateTimeConverter --- .../Converters/IsoDateTimeConverterTests.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs index 47f611f4..937ee426 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/IsoDateTimeConverterTests.cs @@ -274,5 +274,23 @@ namespace Newtonsoft.Json.Tests.Converters Console.WriteLine(jsonText); } + + [Test] + public void DeserializeDateTimeOffset() + { + var settings = new JsonSerializerSettings(); + settings.DateParseHandling = DateParseHandling.DateTimeOffset; + settings.Converters.Add(new IsoDateTimeConverter()); + + // Intentionally use an offset that is unlikely in the real world, + // so the test will be accurate regardless of the local time zone setting. + var offset = new TimeSpan(2, 15, 0); + var dto = new DateTimeOffset(2014, 1, 1, 0, 0, 0, 0, offset); + + var test = JsonConvert.DeserializeObject("\"2014-01-01T00:00:00+02:15\"", settings); + + Assert.AreEqual(dto, test); + Assert.AreEqual(dto.ToString("o"), test.ToString("o")); + } } } \ No newline at end of file From bb1cd89f09192b535a190c3ace8e69948f16a4d3 Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Sat, 5 Apr 2014 20:16:53 -0400 Subject: [PATCH 2/2] Fix invalid cast with DateTimeOffset This occurred when using DateParseHandling.DateTimeOffset --- Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs b/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs index 0f90b870..fd562b69 100644 --- a/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs @@ -136,7 +136,7 @@ namespace Newtonsoft.Json.Converters { #if !NET20 if (t == typeof(DateTimeOffset)) - return new DateTimeOffset((DateTime)reader.Value); + return reader.Value is DateTimeOffset ? reader.Value : new DateTimeOffset((DateTime)reader.Value); #endif return reader.Value;