.NET 5中配置System.Text.Json序列化派生类属性的问题
解决.NET5中System.Text.Json序列化派生类属性的问题
要在MVC中全局配置System.Text.Json,让List<BaseClass>中的派生类所有属性都被序列化,按以下步骤操作:
方法一:通过特性标记基类(推荐,简单直接)
给基类添加派生类型标记
在基类上使用[JsonDerivedType]特性,列出所有需要序列化的派生类:using System.Text.Json.Serialization; [JsonDerivedType(typeof(DerivedClass1))] [JsonDerivedType(typeof(DerivedClass2))] [JsonDerivedType(typeof(DerivedClass3))] [JsonDerivedType(typeof(DerivedClass4))] public class BaseClass { // 基类的4个属性 public int BaseProp1 { get; set; } public string BaseProp2 { get; set; } public bool BaseProp3 { get; set; } public DateTime BaseProp4 { get; set; } }每个派生类正常定义独有属性即可:
public class DerivedClass1 : BaseClass { public string DerivedProp1 { get; set; } public int DerivedProp2 { get; set; } public decimal DerivedProp3 { get; set; } }配置MVC的Json选项
在Startup.cs的ConfigureServices方法中,确保MVC使用的Json序列化器启用多态支持(默认已支持,若有自定义配置需保留默认类型解析器):public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddJsonOptions(options => { // 可添加其他自定义配置,比如驼峰命名 options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 确保使用默认类型解析器,它会识别基类的JsonDerivedType特性 options.JsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver(); }); }
方法二:通过全局配置添加派生类型(适合基类无法修改的场景)
如果基类是第三方库类或无法添加特性,可在MVC配置中手动注册派生类型:
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { typeInfo => { // 匹配基类类型 if (typeInfo.Type == typeof(BaseClass)) { // 配置多态选项,添加所有派生类 typeInfo.PolymorphismOptions = new JsonPolymorphismOptions { DerivedTypes = { new JsonDerivedType(typeof(DerivedClass1)), new JsonDerivedType(typeof(DerivedClass2)), new JsonDerivedType(typeof(DerivedClass3)), new JsonDerivedType(typeof(DerivedClass4)) } }; } } } }; }); }
验证效果
完成配置后,当控制器返回包含List<BaseClass>的ViewModel时,JsonResult会自动序列化每个派生类的所有属性(包括基类属性和独有属性)。
内容的提问来源于stack exchange,提问作者Jonesopolis
相关产品推荐
相关产品推荐

