使用新的“ System.Text.Json”类对System.Data.DataTable进行序列化时发生异常(Asp.net Core 3.0预览版8)

时间:2019-08-18 22:56:21

标签: asp.net json system.text.json

我正在asp.net core 3.0预览版8中编写一个REST API,并且尝试使用新的“ System.Text.Json”类序列化System.Data.DataTable,但是在Serialize方法中,我收到了异常:

  

不支持“ System.Data.DataTable.ChildRelations”上的集合类型“ System.Data.DataRelationCollection”。

使用newtonsoft json序列化程序,相同的序列化效果很好。

重现该问题的示例代码:

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.DataTable.ChildRelations”上的集合类型“ System.Data.DataRelationCollection”。     来源= System.Text.Json     堆栈跟踪:      在System.Text.Json.JsonClassInfo.GetElementType(Type propertyType,Type parentType,MemberInfo memberInfo,JsonSerializerOptions选项)      在System.Text.Json.JsonClassInfo.CreateProperty处(类型为clarifiedPropertyType,类型runtimePropertyType,类型为implementedPropertyType,PropertyInfo propertyInfo,类型为parentClassType,JsonSerializerOptions选项)      在System.Text.Json.JsonClassInfo.AddProperty(Type propertyType,PropertyInfo propertyInfo,Type classType,JsonSerializerOptions选项)      在System.Text.Json.JsonClassInfo..ctor中(类型类型,JsonSerializerOptions选项)      在System.Text.Json.JsonSerializerOptions.GetOrAddClass(Type classType)      在System.Text.Json.WriteStackFrame.Initialize(Type type,JsonSerializerOptions options)      在System.Text.Json.JsonSerializer.WriteCore(Utf8JsonWriter writer,PooledByteBufferWriter输出,对象值,类型类型,JsonSerializerOptions选项)      在System.Text.Json.JsonSerializer.WriteCore(PooledByteBufferWriter输出,对象值,类型类型,JsonSerializerOptions选项)      在System.Text.Json.JsonSerializer.WriteCoreString(对象值,类型,JsonSerializerOptions选项)      在System.Text.Json.JsonSerializer.Serialize [TValue](TValue值,JsonSerializerOptions选项)处      在G:\ testnet \ ErrorJsonMIcrosoftDataTable \ ErrorJsonMIcrosoftDataTable \ Controllers \ WeatherForecastController.cs:line 31中的ErrorJsonMIcrosoftDataTable.Controllers.WeatherForecastController.Get()      在Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target,Object []参数)      在Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper映射器,ObjectMethodExecutor执行器,对象控制器,Object []参数)处      在Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker中。 d.MoveNext()

您能帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

简短的回答:至少暂时还不能使用System.Text.Json。

如果您想使用ASP.NET Core 3.0序列化System.Data.DataTable并提供今天可用的版本,请继续阅读我的文章的其余部分以找到解决方法。

解决方法: 首先,您应该从MS中查看“从ASP.NET Core 2.2迁移到3.0”文档的“ Json.NET支持”。

解决方案包括2个步骤:

  1. 添加对“ Microsoft.AspNetCore.Mvc.NewtonsoftJson”的程序包引用

  2. 在“ services.AddMvc()”之后添加此行“ .AddNewtonsoftJson()” 这是更改前后的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;
    });