-Fixed deserializing DataTable with error handling

This commit is contained in:
James Newton-King
2016-07-19 18:46:33 +12:00
parent b83e1fab4c
commit dada8ea0e3
3 changed files with 53 additions and 2 deletions
@@ -26,6 +26,7 @@
using System.IO;
using System.Text;
using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
#if !(NETFX_CORE || PORTABLE || DNXCORE50 || PORTABLE40)
using System;
@@ -546,6 +547,53 @@ namespace Newtonsoft.Json.Tests.Converters
}
}
#endif
[Test]
public void HandleColumnOnError()
{
string json = "[{\"timeCol\":\"\"}]";
DataTable table = JsonConvert.DeserializeObject<CustomDataTable>(json);
Assert.AreEqual(DBNull.Value, table.Rows[0]["timeCol"]);
}
[JsonConverter(typeof(DataTableConverterTest))]
public class CustomDataTable : DataTable
{
}
public class DataTableConverterTest : DataTableConverter
{
protected DataTable CreateTable()
{
CustomDataTable table = new CustomDataTable();
table.Columns.Add("timeCol", typeof(DateTime));
return table;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (existingValue == null)
{
existingValue = CreateTable();
}
serializer.Error += OnError;
try
{
return base.ReadJson(reader, objectType, existingValue, serializer);
}
finally
{
serializer.Error -= OnError;
}
}
private void OnError(object sender, Json.Serialization.ErrorEventArgs e)
{
e.ErrorContext.Handled = true;
}
}
}
}
@@ -979,7 +979,6 @@ Newtonsoft.Json Error: 0 : Error!
1,
1,
1,
1,
true,
9999999990000000000000000000000000000000000,
true,
@@ -187,7 +187,11 @@ namespace Newtonsoft.Json.Converters
}
else
{
dr[columnName] = (reader.Value != null) ? serializer.Deserialize(reader, column.DataType) : DBNull.Value;
object columnValue = (reader.Value != null)
? serializer.Deserialize(reader, column.DataType) ?? DBNull.Value
: DBNull.Value;
dr[columnName] = columnValue;
}
reader.ReadAndAssert();