From ca2d86532115b7fe14afa296b729aceed46f3024 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 21 Jun 2014 08:21:54 +1200 Subject: [PATCH] -Fixed using DateParseHandling and FloatParseHandling with DataTable/DataSet --- .../Converters/DataTableConverterTests.cs | 53 +++++++++++++++++-- .../Properties/AssemblyInfo.cs | 2 +- .../Converters/DataTableConverter.cs | 9 ++-- .../Properties/AssemblyInfo.cs | 2 +- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs index a926ae5e..0231c080 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs @@ -57,7 +57,8 @@ namespace Newtonsoft.Json.Tests.Converters ], ""ArrayCol"": [ 0 - ] + ], + ""DateCol"": ""2000-12-29T00:00:00Z"" }, { ""id"": 1, @@ -69,7 +70,8 @@ namespace Newtonsoft.Json.Tests.Converters ], ""ArrayCol"": [ 1 - ] + ], + ""DateCol"": ""2000-12-29T00:00:00Z"" } ]"; @@ -77,7 +79,7 @@ namespace Newtonsoft.Json.Tests.Converters Assert.IsNotNull(deserializedDataTable); Assert.AreEqual(string.Empty, deserializedDataTable.TableName); - Assert.AreEqual(4, deserializedDataTable.Columns.Count); + Assert.AreEqual(5, deserializedDataTable.Columns.Count); Assert.AreEqual("id", deserializedDataTable.Columns[0].ColumnName); Assert.AreEqual(typeof(long), deserializedDataTable.Columns[0].DataType); Assert.AreEqual("item", deserializedDataTable.Columns[1].ColumnName); @@ -86,6 +88,8 @@ namespace Newtonsoft.Json.Tests.Converters Assert.AreEqual(typeof(DataTable), deserializedDataTable.Columns[2].DataType); Assert.AreEqual("ArrayCol", deserializedDataTable.Columns[3].ColumnName); Assert.AreEqual(typeof(long[]), deserializedDataTable.Columns[3].DataType); + Assert.AreEqual("DateCol", deserializedDataTable.Columns[4].ColumnName); + Assert.AreEqual(typeof(DateTime), deserializedDataTable.Columns[4].DataType); Assert.AreEqual(2, deserializedDataTable.Rows.Count); @@ -94,14 +98,57 @@ namespace Newtonsoft.Json.Tests.Converters Assert.AreEqual("item 0", dr1["item"]); Assert.AreEqual("0!", ((DataTable)dr1["DataTableCol"]).Rows[0]["NestedStringCol"]); Assert.AreEqual(0, ((long[])dr1["ArrayCol"])[0]); + Assert.AreEqual(new DateTime(2000, 12, 29, 0, 0, 0, DateTimeKind.Utc), dr1["DateCol"]); DataRow dr2 = deserializedDataTable.Rows[1]; Assert.AreEqual(1, dr2["id"]); Assert.AreEqual("item 1", dr2["item"]); Assert.AreEqual("1!", ((DataTable)dr2["DataTableCol"]).Rows[0]["NestedStringCol"]); Assert.AreEqual(1, ((long[])dr2["ArrayCol"])[0]); + Assert.AreEqual(new DateTime(2000, 12, 29, 0, 0, 0, DateTimeKind.Utc), dr2["DateCol"]); } +#if !NET20 + [Test] + public void DeserializeParseHandling() + { + string json = @"[ + { + ""DateCol"": ""2000-12-29T00:00:00Z"", + ""FloatCol"": 99.9999999999999999999 + }, + { + ""DateCol"": ""2000-12-29T00:00:00Z"", + ""FloatCol"": 99.9999999999999999999 + } +]"; + + DataTable deserializedDataTable = JsonConvert.DeserializeObject(json, new JsonSerializerSettings + { + DateParseHandling = DateParseHandling.DateTimeOffset, + FloatParseHandling = FloatParseHandling.Decimal + }); + Assert.IsNotNull(deserializedDataTable); + + Assert.AreEqual(string.Empty, deserializedDataTable.TableName); + Assert.AreEqual(2, deserializedDataTable.Columns.Count); + Assert.AreEqual("DateCol", deserializedDataTable.Columns[0].ColumnName); + Assert.AreEqual(typeof(DateTimeOffset), deserializedDataTable.Columns[0].DataType); + Assert.AreEqual("FloatCol", deserializedDataTable.Columns[1].ColumnName); + Assert.AreEqual(typeof(decimal), deserializedDataTable.Columns[1].DataType); + + Assert.AreEqual(2, deserializedDataTable.Rows.Count); + + DataRow dr1 = deserializedDataTable.Rows[0]; + Assert.AreEqual(new DateTimeOffset(2000, 12, 29, 0, 0, 0, TimeSpan.Zero), dr1["DateCol"]); + Assert.AreEqual(99.9999999999999999999m, dr1["FloatCol"]); + + DataRow dr2 = deserializedDataTable.Rows[1]; + Assert.AreEqual(new DateTimeOffset(2000, 12, 29, 0, 0, 0, TimeSpan.Zero), dr2["DateCol"]); + Assert.AreEqual(99.9999999999999999999m, dr2["FloatCol"]); + } +#endif + [Test] public void Serialize() { diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index b8b9269b..945ece0f 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -75,4 +75,4 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.3.17420")] +[assembly: AssemblyFileVersion("6.0.3.17421")] diff --git a/Src/Newtonsoft.Json/Converters/DataTableConverter.cs b/Src/Newtonsoft.Json/Converters/DataTableConverter.cs index 0d5ae665..47636e17 100644 --- a/Src/Newtonsoft.Json/Converters/DataTableConverter.cs +++ b/Src/Newtonsoft.Json/Converters/DataTableConverter.cs @@ -180,17 +180,14 @@ namespace Newtonsoft.Json.Converters switch (tokenType) { case JsonToken.Integer: - return typeof(long); + case JsonToken.Boolean: case JsonToken.Float: - return typeof(double); case JsonToken.String: + case JsonToken.Date: + return reader.ValueType; case JsonToken.Null: case JsonToken.Undefined: return typeof(string); - case JsonToken.Boolean: - return typeof(bool); - case JsonToken.Date: - return typeof(DateTime); case JsonToken.StartArray: reader.Read(); if (reader.TokenType == JsonToken.StartObject) diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index f22b3357..abcd34c5 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -91,5 +91,5 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.3.17420")] +[assembly: AssemblyFileVersion("6.0.3.17421")] [assembly: CLSCompliant(true)]