Skip to content

Commit be8ecb2

Browse files
committed
Added TimeSpan handling for XML incl. UnitTest
Format is ISO_8601 for durations (XmlSerializer uses this by default) More info: http://en.wikipedia.org/wiki/ISO_8601#Durations
1 parent c86a558 commit be8ecb2

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

RestSharp.Tests/XmlTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,48 @@ public void Can_Deserialize_Elements_to_Nullable_Values()
254254
Assert.Equal(new Guid(GuidString), output.UniqueId);
255255
}
256256

257+
[Fact]
258+
public void Can_Deserialize_TimeSpan()
259+
{
260+
var culture = CultureInfo.InvariantCulture;
261+
var doc = new XDocument(culture);
262+
263+
TimeSpan? nullTimespan = null;
264+
TimeSpan? nullValueTimeSpan = new TimeSpan(21, 30, 7);
265+
266+
var root = new XElement("Person");
267+
root.Add(new XElement("Tick", new TimeSpan(468006)));
268+
root.Add(new XElement("Millisecond", new TimeSpan(0, 0, 0, 0, 125)));
269+
root.Add(new XElement("Second", new TimeSpan(0, 0, 8)));
270+
root.Add(new XElement("Minute", new TimeSpan(0, 55, 2)));
271+
root.Add(new XElement("Hour", new TimeSpan(21, 30, 7)));
272+
root.Add(new XElement("NullableWithoutValue", nullTimespan));
273+
root.Add(new XElement("NullableWithValue", nullValueTimeSpan));
274+
275+
doc.Add(root);
276+
277+
var xml = new XmlDeserializer
278+
{
279+
Culture = culture,
280+
};
281+
282+
var response = new RestResponse { Content = doc.ToString() };
283+
284+
var d = new XmlDeserializer()
285+
{
286+
Culture = culture,
287+
};
288+
var payload = d.Deserialize<TimeSpanTestStructure>(response);
289+
Assert.Equal(new TimeSpan(468006), payload.Tick);
290+
Assert.Equal(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond);
291+
Assert.Equal(new TimeSpan(0, 0, 8), payload.Second);
292+
Assert.Equal(new TimeSpan(0, 55, 2), payload.Minute);
293+
Assert.Equal(new TimeSpan(21, 30, 7), payload.Hour);
294+
Assert.Null(payload.NullableWithoutValue);
295+
Assert.NotNull(payload.NullableWithValue);
296+
Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value);
297+
}
298+
257299
[Fact]
258300
public void Can_Deserialize_Custom_Formatted_Date()
259301
{

RestSharp/Deserializers/XmlDeserializer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,12 @@ private void Map(object x, XElement root)
179179
var raw = value.ToString();
180180
value = string.IsNullOrEmpty(raw) ? Guid.Empty : new Guid(value.ToString());
181181
prop.SetValue(x, value, null);
182-
}
182+
}
183+
else if (type == typeof(TimeSpan))
184+
{
185+
var timeSpan = XmlConvert.ToTimeSpan(value.ToString());
186+
prop.SetValue(x, timeSpan, null);
187+
}
183188
else if (type.IsGenericType)
184189
{
185190
var t = type.GetGenericArguments()[0];

0 commit comments

Comments
 (0)