-Fixed using DateParseHandling and FloatParseHandling with DataTable/DataSet

This commit is contained in:
James Newton-King
2014-06-21 08:21:54 +12:00
parent 9b8e353530
commit ca2d865321
4 changed files with 55 additions and 11 deletions
@@ -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<DataTable>(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()
{
@@ -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")]
@@ -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)
@@ -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)]