.NET 7中使用System.Text.Json实现所有子类的多态序列化
.NET 7 批量配置多态序列化的简洁方案
当派生类数量较多时,逐个添加[JsonDerivedType]确实低效,以下两种方案可以批量完成多态序列化配置:
1. 反射扫描程序集 + 自定义JsonSerializerOptions
通过反射自动扫描指定程序集中所有继承自目标基类的类型,手动添加到序列化选项的多态配置中:
using System.Reflection; using System.Text.Json.Serialization; public static class JsonOptionsExtensions { public static void AddPolymorphicTypesForBase<TBase>(this JsonSerializerOptions options, Assembly assembly) { // 筛选出程序集中非抽象、非基类本身的派生类型 var derivedTypes = assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.IsAssignableTo(typeof(TBase)) && t != typeof(TBase)); var polymorphismOptions = options.GetPolymorphismOptions(typeof(TBase)) ?? new JsonPolymorphismOptions(); foreach (var type in derivedTypes) { // 用类型名称作为序列化标识,也可自定义为全限定名避免冲突 polymorphismOptions.DerivedTypes.Add(new JsonDerivedType(type, type.Name)); } options.SetPolymorphismOptions(typeof(TBase), polymorphismOptions); } } // 使用示例 var options = new JsonSerializerOptions(); // 扫描当前程序集内的所有派生类 options.AddPolymorphicTypesForBase<BaseClass>(Assembly.GetExecutingAssembly()); // 序列化测试 BaseClass instance = new ChildClass { FirstName = "John", LastName = "Doe" }; string json = JsonSerializer.Serialize(instance, options); // 反序列化测试 var deserialized = JsonSerializer.Deserialize<BaseClass>(json, options);
2. ASP.NET Core 全局配置
如果是ASP.NET Core项目,可在Program.cs中全局配置该选项,所有API接口的序列化都会自动生效:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(options => { // 扫描包含基类的程序集 var targetAssembly = typeof(BaseClass).Assembly; options.JsonSerializerOptions.AddPolymorphicTypesForBase<BaseClass>(targetAssembly); }); var app = builder.Build(); // ... 后续中间件配置
注意事项
- 若派生类分布在多个程序集,可多次调用扫描方法覆盖所有目标程序集。
- 类型标识符可按需自定义,比如用类型全限定名避免不同命名空间下同名类型的冲突。
- 反射过滤时记得排除抽象类,避免添加无效的多态配置项。
内容的提问来源于stack exchange,提问作者user246392
相关产品推荐
相关产品推荐

