我正在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()
您能帮忙吗?
谢谢。
答案 0 :(得分:3)
简短的回答:至少暂时还不能使用System.Text.Json。
如果您想使用ASP.NET Core 3.0序列化System.Data.DataTable并提供今天可用的版本,请继续阅读我的文章的其余部分以找到解决方法。
解决方法: 首先,您应该从MS中查看“从ASP.NET Core 2.2迁移到3.0”文档的“ Json.NET支持”。
解决方案包括2个步骤:
添加对“ Microsoft.AspNetCore.Mvc.NewtonsoftJson”的程序包引用
在“ 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;
});