From dada8ea0e3845908faab934ce1ad1f321d580437 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 19 Jul 2016 18:46:33 +1200 Subject: [PATCH] -Fixed deserializing DataTable with error handling --- .../Converters/DataTableConverterTests.cs | 48 +++++++++++++++++++ .../Serialization/TraceWriterTests.cs | 1 - .../Converters/DataTableConverter.cs | 6 ++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs index 0a22a17d..44da723d 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/DataTableConverterTests.cs @@ -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(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; + } + } } } diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs index 2689434d..010e2c46 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs @@ -979,7 +979,6 @@ Newtonsoft.Json Error: 0 : Error! 1, 1, 1, - 1, true, 9999999990000000000000000000000000000000000, true, diff --git a/Src/Newtonsoft.Json/Converters/DataTableConverter.cs b/Src/Newtonsoft.Json/Converters/DataTableConverter.cs index b2f775a8..fcac67bc 100644 --- a/Src/Newtonsoft.Json/Converters/DataTableConverter.cs +++ b/Src/Newtonsoft.Json/Converters/DataTableConverter.cs @@ -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();