使用新的“System.Text.Json”类 (Asp.net core 3.0预览版8) 序列化 System.Data.DataTable 时出现异常。

5
我正在使用 asp.net core 3.0 preview 8 编写一个 rest api,并尝试使用新的 "System.Text.Json" 类来序列化 System.Data.DataTable。但是,在 Serialize 方法中,我收到了以下异常信息: “'System.Data.DataTable.ChildRelations' 上的 'System.Data.DataRelationCollection' 集合类型不受支持。”
使用 newtonsoft json serializer 进行序列化时,则不会出现这个问题。
以下是复现问题的示例代码:
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’。 Source=System.Text.Json StackTrace: at System.Text.Json.JsonClassInfo.GetElementType(Type propertyType, Type parentType, MemberInfo memberInfo, JsonSerializerOptions options) at System.Text.Json.JsonClassInfo.CreateProperty(Type declaredPropertyType, Type runtimePropertyType, Type implementedPropertyType, PropertyInfo propertyInfo, Type parentClassType, JsonSerializerOptions options) at System.Text.Json.JsonClassInfo.AddProperty(Type propertyType, PropertyInfo propertyInfo, Type classType, JsonSerializerOptions options) at System.Text.Json.JsonClassInfo..ctor(Type type, JsonSerializerOptions options) at System.Text.Json.JsonSerializerOptions.GetOrAddClass(Type classType) at System.Text.Json.WriteStackFrame.Initialize(Type type, JsonSerializerOptions options) at System.Text.Json.JsonSerializer.WriteCore(Utf8JsonWriter writer, PooledByteBufferWriter output, Object value, Type type, JsonSerializerOptions options) at System.Text.Json.JsonSerializer.WriteCore(PooledByteBufferWriter output, Object value, Type type, JsonSerializerOptions options) at System.Text.Json.JsonSerializer.WriteCoreString(Object value, Type type, JsonSerializerOptions options) at System.Text.Json.JsonSerializer.Serialize[TValue](TValue value, JsonSerializerOptions options) at ErrorJsonMIcrosoftDataTable.Controllers.WeatherForecastController.Get() in G:\testnet\ErrorJsonMIcrosoftDataTable\ErrorJsonMIcrosoftDataTable\Controllers\WeatherForecastController.cs:line 31 at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<g__Logged|12_1>d.MoveNext()

请问是否需要帮助?

谢谢。


在我的情况下,如果我能找到一种忽略ChildRelations属性的方法,我会很高兴。 - Auspex
您需要反序列化还是仅需序列化?使用JsonConverter,序列化比反序列化容易得多。 - dbc
请参考 https://dev59.com/5kMEtIcB2Jgan1zn1l78,使用 System.Text.Json 解决问题。 - Rory
1个回答

6

简短回答:目前无法使用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;
    });

3
告诉OP回到旧的JSON序列化程序(他们显然已经知道它可以工作)如何回答问题?这是一个关于如何使新的序列化程序工作的问题。如果你不能,那么答案就是“无法完成”,而不是描述如何使用不同的序列化程序。 - Auspex
@Unoparator 谢谢你,你的示例代码帮了我很多。 - Fabio Pagano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接