From 6ff30962d6384da25f2f2d1fc80a70cc013483ff Mon Sep 17 00:00:00 2001 From: Brian Weber Date: Wed, 18 Feb 2015 16:54:27 -0500 Subject: [PATCH 1/2] Adding support for deserializing ISO 8601 durations as TimeSpan in JSON --- RestSharp.Tests/JsonTests.cs | 8 ++++++++ RestSharp.Tests/SampleClasses/misc.cs | 12 ++++++++++++ RestSharp.Tests/SampleData/timespans.txt | 6 ++++++ RestSharp/Deserializers/JsonDeserializer.cs | 10 +++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/RestSharp.Tests/JsonTests.cs b/RestSharp.Tests/JsonTests.cs index 4d013cc5d..e1044fa4b 100644 --- a/RestSharp.Tests/JsonTests.cs +++ b/RestSharp.Tests/JsonTests.cs @@ -539,6 +539,14 @@ public void Can_Deserialize_TimeSpan() Assert.Null(payload.NullableWithoutValue); Assert.NotNull(payload.NullableWithValue); Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value); + Assert.Equal(new TimeSpan(0, 0, 10), payload.IsoSecond); + Assert.Equal(new TimeSpan(0, 3, 23), payload.IsoMinute); + Assert.Equal(new TimeSpan(5, 4, 9), payload.IsoHour); + Assert.Equal(new TimeSpan(1, 19, 27, 13), payload.IsoDay); + // 2 months + 4 days = 64 days + Assert.Equal(new TimeSpan(64, 3, 14, 19), payload.IsoMonth); + // 1 year = 365 days + Assert.Equal(new TimeSpan(365, 9, 27, 48), payload.IsoYear); } [Fact] diff --git a/RestSharp.Tests/SampleClasses/misc.cs b/RestSharp.Tests/SampleClasses/misc.cs index ec3d0658f..e90cfe626 100644 --- a/RestSharp.Tests/SampleClasses/misc.cs +++ b/RestSharp.Tests/SampleClasses/misc.cs @@ -233,6 +233,18 @@ public class TimeSpanTestStructure public TimeSpan? NullableWithoutValue { get; set; } public TimeSpan? NullableWithValue { get; set; } + + public TimeSpan? IsoSecond { get; set; } + + public TimeSpan? IsoMinute { get; set; } + + public TimeSpan? IsoHour { get; set; } + + public TimeSpan? IsoDay { get; set; } + + public TimeSpan? IsoMonth { get; set; } + + public TimeSpan? IsoYear { get; set; } } public class JsonEnumsTestStructure diff --git a/RestSharp.Tests/SampleData/timespans.txt b/RestSharp.Tests/SampleData/timespans.txt index a06caabee..7b8ea2071 100644 --- a/RestSharp.Tests/SampleData/timespans.txt +++ b/RestSharp.Tests/SampleData/timespans.txt @@ -6,4 +6,10 @@ "Hour": "21:30:07.0000000", "NullableWithoutValue": null, "NullableWithValue": "21:30:07.0000000", + "IsoSecond": "PT10S", + "IsoMinute": "PT3M23S", + "IsoHour": "PT5H4M9S", + "IsoDay": "P1DT19H27M13S", + "IsoMonth": "P2M4DT3H14M19S", + "IsoYear": "P1YT9H27M48S" } diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index 04bdf629a..d1912b6ca 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -7,6 +7,8 @@ namespace RestSharp.Deserializers { + using System.Xml; + public class JsonDeserializer : IDeserializer { public string RootElement { get; set; } @@ -270,7 +272,13 @@ private object ConvertValue(Type type, object value) } else if (type == typeof(TimeSpan)) { - return TimeSpan.Parse(stringValue); + TimeSpan timeSpan; + if (TimeSpan.TryParse(stringValue, out timeSpan)) + { + return timeSpan; + } + // + return XmlConvert.ToTimeSpan(stringValue); } else if (type.IsGenericType) { From 3a83ab634393c5e75eaf0fb10e83dad36f7ffd51 Mon Sep 17 00:00:00 2001 From: Brian Weber Date: Thu, 19 Feb 2015 09:15:43 -0500 Subject: [PATCH 2/2] Comment --- RestSharp/Deserializers/JsonDeserializer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RestSharp/Deserializers/JsonDeserializer.cs b/RestSharp/Deserializers/JsonDeserializer.cs index d1912b6ca..a4fa757d6 100644 --- a/RestSharp/Deserializers/JsonDeserializer.cs +++ b/RestSharp/Deserializers/JsonDeserializer.cs @@ -277,7 +277,8 @@ private object ConvertValue(Type type, object value) { return timeSpan; } - // + + // This should handle ISO 8601 durations return XmlConvert.ToTimeSpan(stringValue); } else if (type.IsGenericType)