Исключение в сериализации System.Data.DataTable с использованием нового класса "System.Text.Json" (Asp.net core 3.0 preview 8)
Я пишу API остальных в asp.net core 3.0 preview 8, и я пытался сериализовать System.Data.DataTable, используя новый класс "System.Text.Json", но в методе Serialize я получаю исключение:
Тип коллекции "System.Data.DataRelationCollection" в "System.Data.DataTable.ChildRelations" не поддерживается.
Та же сериализация работает хорошо, используя сериализатор jtons newtonsoft.
Пример кода для воспроизведения проблемы:
var dt = new System.Data.DataTable("test");
dt.Columns.Add("Column1");
var ser=System.Text.Json.JsonSerializer.Serialize(dt);
Подробное исключение:
System.NotSupportedException HResult = 0x80131515 Message = Тип коллекции "System.Data.DataRelationCollection" для "System.Data.DataTable.ChildRelations" не поддерживается. Источник =System.Text.Json StackTrace: в System.Text.Json.JsonClassInfo.GetElementType(тип PropertyType, тип parentType, MemberInfo MemberInfo, варианты JsonSerializerOptions) в System.Text.Json.JsonClassInfo.CreateProperty (тип declaredPropertyType, тип runtimePropertyType, тип реализовано PropertyType, PropertyInfo, свойство Info, тип parentClassType, параметры JsonSerializerOptions) в System.Text.Json.JsonClassInfo.AddProperty(тип propertyType, свойство PropertyInfoInfo, тип classType, параметры JsonSerializerOptions) в System.Text.JInz. параметров) в System.Text.Json.JsonSerializerOptions.GetOrAddClass(тип classType) в System.Text.Json.WriteStackFrame.Initialize(параметры типа Тип, JsonSerializerOptions) в System.Text.Json.JsonSerializer.WriteCore(выходной буфер), UerfertWeerWerteWerteWeerWerteWeer8 Значение объекта, тип Type, параметры JsonSerializerOptions) в System.Text.Json.JsonSerializer.WriteCore(вывод PooledByteBufferWriter, Значение объекта, тип Type, параметры JsonSerializerOptions) в System.Text.Json.JsonSerializer.WriteCoreString(значение объекта, тип Type, параметры JsonSerializerOptions) в System.Text.Json.JsonSerializer.Serialize[TValue](значение TValue, параметры JsonSerializerOptions) в ErrorJsonMIcrosoftDataTable.Controllers.WeatherForecastController.Get() в G:\testnet\ErrorJsonMIcrosoftDataTable\ErrorJsonMIcrosoftDataTable\Controllers\WeatherForecastController.cs: строка 31 в Microsoft.Extensions.Internal.ObjectMext.Exject.ExeOntEntE.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute (сопоставитель IActionResultTypeMapper, исполнитель ObjectMethodExecutor, контроллер объекта, аргументы Object []) в Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInog_Exject_Exject_Exject_Exject_Gate.
Можете ли вы помочь?
Спасибо.
0 ответов
Краткий ответ: это невозможно сделать с System.Text.Json, по крайней мере, на данный момент.
Если вы хотите сериализовать System.Data.DataTable с помощью ASP.NET Core 3.0 с тем, что доступно сегодня, продолжайте читать оставшуюся часть моего сообщения, чтобы найти обходной путь.
Обходной путь : Прежде всего, вы должны проверить "Поддержка Json.NET" в документе "Миграция с ASP.NET Core 2.2 на 3.0" от MS.
Решение состоит из 2 шагов:
Добавьте ссылку на пакет "Microsoft.AspNetCore.Mvc.NewtonsoftJson"
Добавьте эту строку ".AddNewtonsoftJson()" сразу после "services.AddMvc()" Вот пример для Startup.cs до и после изменения:
Перед:
services
.AddMvc(options =>
{
options.EnableEndpointRouting = false;
})
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.IgnoreNullValues = true;
options.JsonSerializerOptions.WriteIndented = true;
});
После:
services
.AddMvc(options =>
{
options.EnableEndpointRouting = false;
})
.AddNewtonsoftJson()
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.IgnoreNullValues = true;
options.JsonSerializerOptions.WriteIndented = true;
});