You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 5中配置System.Text.Json序列化派生类属性的问题

解决.NET5中System.Text.Json序列化派生类属性的问题

要在MVC中全局配置System.Text.Json,让List<BaseClass>中的派生类所有属性都被序列化,按以下步骤操作:

方法一:通过特性标记基类(推荐,简单直接)

  1. 给基类添加派生类型标记
    在基类上使用[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; }
    }
    
  2. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:09:24