ASP.NET Core 5下如何从swagger.json的schema中忽略类类型属性
解决方法
你遇到的问题是由于之前的SchemaFilter仅移除了父类中标记[SwaggerIgnore]的属性映射,没有主动清理Swagger Schema仓库中已经预生成的第三方类定义,所以冗余的第三方类Schema还是会保留在文档中。
1. 实现完整的SchemaFilter
更新你的SchemaFilter代码,同时完成「移除标记忽略的属性」和「清理对应类型的Schema及关联依赖」两个动作:
public class SwaggerIgnoreFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (schema.Properties == null || !schema.Properties.Any()) return; // 筛选所有标记了[SwaggerIgnore]的属性 var ignoredProperties = context.Type.GetProperties() .Where(prop => prop.IsDefined(typeof(SwaggerIgnoreAttribute), inherit: false)); foreach (var prop in ignoredProperties) { // 适配Swagger默认的小驼峰属性命名规则,如果你的配置用了其他命名规则这里对应修改 var camelCasePropName = char.ToLowerInvariant(prop.Name[0]) + prop.Name[1..]; if (schema.Properties.ContainsKey(camelCasePropName)) { // 移除父类中的属性映射 schema.Properties.Remove(camelCasePropName); // 递归清理该属性类型和其所有内部关联类型的Schema RemoveRelatedSchemas(prop.PropertyType, context.SchemaRepository); } } } // 递归清理关联类型Schema private void RemoveRelatedSchemas(Type type, SchemaRepository schemaRepo) { // 跳过基础类型 if (type.IsPrimitive || type == typeof(string) || type == typeof(DateTime) || type == typeof(Guid)) return; // 移除当前类型的Schema schemaRepo.Schemas.Remove(type.Name); schemaRepo.Schemas.Remove(type.FullName); // 处理泛型参数 if (type.IsGenericType) { foreach (var genericArg in type.GetGenericArguments()) { RemoveRelatedSchemas(genericArg, schemaRepo); } } // 处理类内部的属性类型 foreach (var prop in type.GetProperties()) { RemoveRelatedSchemas(prop.PropertyType, schemaRepo); } } }
2. 注册Filter并加全局忽略规则
在Startup.cs/Program.cs的Swagger配置中注册上述Filter,还可以直接加全局规则屏蔽整个第三方命名空间下的所有类型,双重保险:
services.AddSwaggerGen(options => { // 注册自定义SchemaFilter options.SchemaFilter<SwaggerIgnoreFilter>(); // 全局屏蔽不需要生成Schema的类型/命名空间 options.CustomSchemaIds(type => { // 直接匹配第三方类的命名空间前缀,一次性屏蔽所有该命名空间下的类 if (type.Namespace?.StartsWith("第三方库的根命名空间") == true) { return null; } // 其他类型正常返回SchemaId return type.FullName; }); });
修改完成后重新启动项目,标记了[SwaggerIgnore]的类类型属性及其关联的所有第三方类Schema都会被彻底移除。
内容的提问来源于stack exchange,提问作者Mateech
相关产品推荐
相关产品推荐

