.NET5升级后Core WebAPI未返回全部参数问题排查
.NET 5序列化接口类型丢失实现类字段的解决方案
你在将.NET 4.5升级到.NET 5后遇到的问题,核心原因是序列化器行为差异:
- .NET Framework的WebAPI默认使用Newtonsoft.Json,它会自动序列化对象的实际类型(这里是
JComponentRte)的所有成员; - .NET 5默认使用
System.Text.Json,它默认仅序列化声明类型(这里是IJComponent接口)中定义的成员,因此Text字段被忽略。
下面是两种可行的解决方法:
方法1:切换回Newtonsoft.Json(快速兼容旧行为)
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在
Startup.cs的ConfigureServices方法中配置:
services.AddControllers() .AddNewtonsoftJson(); // 替换默认的System.Text.Json为Newtonsoft.Json
配置完成后,序列化逻辑会和.NET Framework一致,自动返回JComponentRte的所有字段。
方法2:为System.Text.Json配置多态序列化
如果想继续使用System.Text.Json,需要自定义转换器来处理多态类型:
- 创建自定义转换器:
public class JComponentConverter : JsonConverter<IJComponent> { // 反序列化逻辑(如需处理请求反序列化) public override IJComponent Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var doc = JsonDocument.ParseValue(ref reader); var typeValue = doc.RootElement.GetProperty("Type").GetString(); return typeValue switch { "My type" => JsonSerializer.Deserialize<JComponentRte>(doc.RootElement.GetRawText(), options), _ => throw new NotSupportedException($"不支持的组件类型:{typeValue}") }; } // 序列化时使用对象的实际类型 public override void Write(Utf8JsonWriter writer, IJComponent value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, value.GetType(), options); } }
- 在
Startup.cs中注册转换器:
services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JComponentConverter()); });
这样System.Text.Json在序列化时会识别对象的实际类型,输出Text字段。
内容的提问来源于stack exchange,提问作者brother
相关产品推荐
相关产品推荐

