C#子类添加JsonIgnore隐藏父类属性 Swagger不生效如何解决
问题原因
你当前使用new关键字隐藏父类属性的方式不生效,是因为JSON序列化器和Swagger生成器默认会优先识别父类中定义的属性元数据,你添加到子类new出来的同名字段的[JsonIgnore]特性仅对该子类新声明的成员生效,不会作用到父类继承的原属性上,所以序列化和文档生成时依旧会展示该字段。
可行解决方案
方案1:父类属性改virtual,子类override(优先推荐,改造成本最低)
如果允许修改父类QuestionCreateRequest的代码,直接将父类的DependantQuestion属性标记为virtual,子类用override重写该属性并添加[JsonIgnore]即可生效:
// 父类修改 public class QuestionCreateRequest { // 原有属性添加virtual修饰 public virtual DependantQuestionCreateRequest DependantQuestion { get; set; } // 其余属性保持不变 } // 子类修改 public class DependantQuestionCreateRequest : QuestionCreateRequest { [JsonIgnore] public override DependantQuestionCreateRequest DependantQuestion { get; set; } }
该方案下System.Text.Json、Newtonsoft.Json以及主流Swagger生成组件都会自动识别子类重写属性的[JsonIgnore]特性,自动忽略该字段。
方案2:无法修改父类时,自定义序列化规则+Swagger过滤
如果父类不允许修改,分别配置序列化规则和Swagger的Schema过滤规则即可:
序列化忽略配置(以ASP.NET Core为例)
如果你用System.Text.Json作为序列化器:
// Program.cs中配置序列化选项 builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { typeInfo => { // 仅子类序列化时忽略该属性 if (typeInfo.Type == typeof(DependantQuestionCreateRequest)) { var prop = typeInfo.Properties.FirstOrDefault(p => p.Name == nameof(DependantQuestionCreateRequest.DependantQuestion)); if (prop != null) prop.ShouldSerialize = (_, _) => false; } } } }; });
如果你用Newtonsoft.Json作为序列化器:
// 自定义合约解析器 public class IgnoreDependantQuestionContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); if (property.DeclaringType == typeof(QuestionCreateRequest) && member.ReflectedType == typeof(DependantQuestionCreateRequest) && property.PropertyName == nameof(DependantQuestionCreateRequest.DependantQuestion)) { property.Ignored = true; } return property; } } // Program.cs中注册 builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new IgnoreDependantQuestionContractResolver(); });
Swagger文档隐藏配置
自定义Schema过滤器,生成子类文档时移除对应字段:
public class IgnoreDependantQuestionSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.Type == typeof(DependantQuestionCreateRequest)) { schema.Properties.Remove("dependantQuestion"); } } } // Program.cs中注册到Swagger生成配置 builder.Services.AddSwaggerGen(options => { options.SchemaFilter<IgnoreDependantQuestionSchemaFilter>(); // 其余Swagger配置保持不变 });
内容的提问来源于stack exchange,提问作者Mr.Deer
相关产品推荐
相关产品推荐

