Исключение в сериализации 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 шагов:

  1. Добавьте ссылку на пакет "Microsoft.AspNetCore.Mvc.NewtonsoftJson"

  2. Добавьте эту строку ".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;
    });
Другие вопросы по тегам