Skip to content

Commit 3642ea4

Browse files
committed
Merge pull request restsharp#644 from briangweber/iso_timespan
Adding support for deserializing ISO 8601 durations as TimeSpan in JSON
2 parents 0b9d700 + 3a83ab6 commit 3642ea4

File tree

4 files changed

+36
-1
lines changed

4 files changed

+36
-1
lines changed

RestSharp.Tests/JsonTests.cs

+8
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,14 @@ public void Can_Deserialize_TimeSpan()
539539
Assert.Null(payload.NullableWithoutValue);
540540
Assert.NotNull(payload.NullableWithValue);
541541
Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value);
542+
Assert.Equal(new TimeSpan(0, 0, 10), payload.IsoSecond);
543+
Assert.Equal(new TimeSpan(0, 3, 23), payload.IsoMinute);
544+
Assert.Equal(new TimeSpan(5, 4, 9), payload.IsoHour);
545+
Assert.Equal(new TimeSpan(1, 19, 27, 13), payload.IsoDay);
546+
// 2 months + 4 days = 64 days
547+
Assert.Equal(new TimeSpan(64, 3, 14, 19), payload.IsoMonth);
548+
// 1 year = 365 days
549+
Assert.Equal(new TimeSpan(365, 9, 27, 48), payload.IsoYear);
542550
}
543551

544552
[Fact]

RestSharp.Tests/SampleClasses/misc.cs

+12
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,18 @@ public class TimeSpanTestStructure
233233
public TimeSpan? NullableWithoutValue { get; set; }
234234

235235
public TimeSpan? NullableWithValue { get; set; }
236+
237+
public TimeSpan? IsoSecond { get; set; }
238+
239+
public TimeSpan? IsoMinute { get; set; }
240+
241+
public TimeSpan? IsoHour { get; set; }
242+
243+
public TimeSpan? IsoDay { get; set; }
244+
245+
public TimeSpan? IsoMonth { get; set; }
246+
247+
public TimeSpan? IsoYear { get; set; }
236248
}
237249

238250
public class JsonEnumsTestStructure

RestSharp.Tests/SampleData/timespans.txt

+6
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,10 @@
66
"Hour": "21:30:07.0000000",
77
"NullableWithoutValue": null,
88
"NullableWithValue": "21:30:07.0000000",
9+
"IsoSecond": "PT10S",
10+
"IsoMinute": "PT3M23S",
11+
"IsoHour": "PT5H4M9S",
12+
"IsoDay": "P1DT19H27M13S",
13+
"IsoMonth": "P2M4DT3H14M19S",
14+
"IsoYear": "P1YT9H27M48S"
915
}

RestSharp/Deserializers/JsonDeserializer.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
namespace RestSharp.Deserializers
99
{
10+
using System.Xml;
11+
1012
public class JsonDeserializer : IDeserializer
1113
{
1214
public string RootElement { get; set; }
@@ -270,7 +272,14 @@ private object ConvertValue(Type type, object value)
270272
}
271273
else if (type == typeof(TimeSpan))
272274
{
273-
return TimeSpan.Parse(stringValue);
275+
TimeSpan timeSpan;
276+
if (TimeSpan.TryParse(stringValue, out timeSpan))
277+
{
278+
return timeSpan;
279+
}
280+
281+
// This should handle ISO 8601 durations
282+
return XmlConvert.ToTimeSpan(stringValue);
274283
}
275284
else if (type.IsGenericType)
276285
{

0 commit comments

Comments
 (0)