.NET 5中移除Swagger UI请求体默认的"string"显示
解决.NET 5 Swagger请求体显示"string"改为"{}"的问题
问题分析
你当前的过滤器代码遍历了schema.Properties,但从swagger.json输出看,请求体的schema本身要么是string类型(无Properties属性),要么是空对象结构,导致遍历逻辑未触发,修改无效。
修正后的过滤器代码
public class EmptyStringRequestBodyFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { if (operation.RequestBody == null) return; // 遍历所有请求内容类型(如application/json、application/json-patch+json等) foreach (var contentEntry in operation.RequestBody.Content) { var schema = contentEntry.Value.Schema; if (schema == null) continue; // 处理schema本身为string类型的情况 if (schema.Type == "string") { schema.Example = new OpenApiString("{}"); schema.Default = new OpenApiString("{}"); } // 处理空对象类型的schema else if (schema.Type == "object" && schema.Properties.Count == 0) { schema.Example = OpenApiAnyFactory.CreateFromJson("{}"); } } } }
正确注册过滤器
需在AddSwaggerGen的配置中显式添加该过滤器,而非仅注册服务:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); // 注册自定义请求体过滤器 c.OperationFilter<EmptyStringRequestBodyFilter>(); });
额外说明
- 如果接口原本应接收空对象而非字符串,更合理的做法是将接口参数类型改为
object,或定义一个空DTO类(如public class EmptyRequest { }),Swagger会自动识别为{}格式的请求体。 - 若必须保持参数为
string类型,上述过滤器代码会将请求体的示例和默认值替换为{},解决显示问题。
内容的提问来源于stack exchange,提问作者K.W
相关产品推荐
相关产品推荐

