Skip to content

Commit 40d2dce

Browse files
committed
Merge git://github.com/ntziolis/RestSharp
Conflicts: RestSharp/Deserializers/JsonDeserializer.cs
2 parents 4f97488 + be8ecb2 commit 40d2dce

File tree

7 files changed

+95
-2
lines changed

7 files changed

+95
-2
lines changed

RestSharp.Tests/JsonTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,24 @@ public void Ignore_ReadOnly_Property_That_Exists_In_Data()
313313
Assert.Null(p.ReadOnlyProxy);
314314
}
315315

316+
[Fact]
317+
public void Can_Deserialize_TimeSpan()
318+
{
319+
var doc = File.ReadAllText(Path.Combine("SampleData", "timespans.txt"));
320+
var d = new JsonDeserializer();
321+
var response = new RestResponse { Content = doc };
322+
var payload = d.Deserialize<TimeSpanTestStructure>(response);
323+
324+
Assert.Equal(new TimeSpan(468006), payload.Tick);
325+
Assert.Equal(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond);
326+
Assert.Equal(new TimeSpan(0, 0, 8), payload.Second);
327+
Assert.Equal(new TimeSpan(0, 55, 2), payload.Minute);
328+
Assert.Equal(new TimeSpan(21, 30, 7), payload.Hour);
329+
Assert.Null(payload.NullableWithoutValue);
330+
Assert.NotNull(payload.NullableWithValue);
331+
Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value);
332+
}
333+
316334
[Fact]
317335
public void Can_Deserialize_Iso_Json_Dates()
318336
{

RestSharp.Tests/RestSharp.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@
151151
<Content Include="SampleData\Lastfm.xml">
152152
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
153153
</Content>
154+
<Content Include="SampleData\timespans.txt">
155+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
156+
</Content>
154157
<Content Include="SampleData\xmllists.xml">
155158
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
156159
</Content>

RestSharp.Tests/SampleClasses/misc.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,17 @@ public class DateTimeTestStructure
154154
public DateTimeOffset? NullableDateTimeOffsetWithValue { get; set; }
155155
}
156156

157+
public class TimeSpanTestStructure
158+
{
159+
public TimeSpan Tick { get; set; }
160+
public TimeSpan Millisecond { get; set; }
161+
public TimeSpan Second { get; set; }
162+
public TimeSpan Minute { get; set; }
163+
public TimeSpan Hour { get; set; }
164+
public TimeSpan? NullableWithoutValue { get; set; }
165+
public TimeSpan? NullableWithValue { get; set; }
166+
}
167+
157168
public class JsonEnumsTestStructure
158169
{
159170
public Disposition Upper { get; set; }
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"Tick": "00:00:00.0468006",
3+
"Millisecond": "00:00:00.1250000",
4+
"Second": "00:00:08.0000000",
5+
"Minute": "00:55:02.0000000",
6+
"Hour": "21:30:07.0000000",
7+
"NullableWithoutValue": null,
8+
"NullableWithValue": "21:30:07.0000000",
9+
}

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/JsonDeserializer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,12 @@ private void Map(object target, IDictionary<string, object> data)
140140
string raw = value.ToString();
141141
var guid = string.IsNullOrEmpty(raw) ? Guid.Empty : new Guid(raw);
142142
prop.SetValue(target, guid, null);
143-
}
143+
}
144+
else if (type == typeof(TimeSpan))
145+
{
146+
var timeSpan = TimeSpan.Parse(value.ToString());
147+
prop.SetValue(target, timeSpan, null);
148+
}
144149
else if (type.IsGenericType)
145150
{
146151
var genericTypeDef = type.GetGenericTypeDefinition();

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)