NET8 Web API项目:如何在Swagger中展示无类型输入的JSON Schema
解决方案
首选方案:使用NJsonSchema.Swashbuckle NuGet包
这个是NJsonSchema官方提供的Swagger集成工具,能直接把你的JSON Schema同步到OpenAPI规范里,操作简单。
安装NuGet包
包管理器控制台执行:Install-Package NJsonSchema.Swashbuckle或.NET CLI:
dotnet add package NJsonSchema.Swashbuckle配置Swagger服务
在Program.cs的Swagger配置中,添加NJsonSchema扩展并注册你的验证Schema:builder.Services.AddSwaggerGen(c => { // 启用NJsonSchema与Swagger的集成 c.AddNJsonSchema(); // 替换成你实际的JsonSchema实例(比如预先从文件加载或代码生成的) var yourValidationSchema = _jsonSchema; // 将Schema注册到Swagger的组件库中 c.SchemaGenerator.GenerateSchema(yourValidationSchema.TypeName, c.SchemaRepository); // 添加自定义过滤器绑定Schema到目标Action c.OperationFilter<UploadActionRequestBodyFilter>(); });自定义过滤器绑定Schema到Upload Action
创建过滤器类,手动将你的验证Schema关联到Upload接口的请求体:public class UploadActionRequestBodyFilter : IOperationFilter { private readonly JsonSchema _validationSchema; public UploadActionRequestBodyFilter(JsonSchema validationSchema) { _validationSchema = validationSchema; } public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 匹配你的Upload Action if (context.ApiDescription.ActionDescriptor.RouteValues["action"] == "Upload" && context.ApiDescription.HttpMethod == HttpMethod.Post.Method) { // 将NJsonSchema转换为OpenApiSchema格式 var openApiSchema = _validationSchema.ToOpenApiSchema(); // 配置请求体 operation.RequestBody = new OpenApiRequestBody { Content = new Dictionary<string, OpenApiMediaType> { ["application/json"] = new OpenApiMediaType { Schema = openApiSchema } }, Required = true }; } } }记得在Program.cs里注册过滤器时注入你的JsonSchema实例:
builder.Services.AddSingleton<IOperationFilter>(sp => new UploadActionRequestBodyFilter(sp.GetRequiredService<JsonSchema>()));
替代方案:手动编写过滤器(无需额外NuGet)
如果不想新增依赖,直接用NJsonSchema自带的ToOpenApiSchema()方法实现自定义过滤器,步骤和上面的过滤器部分一致,只是不需要安装NJsonSchema.Swashbuckle包。
注意事项
- 确保你的
JsonSchema实例已正确加载(比如从文件读取、代码生成),且包含完整的验证规则。 - 若Schema是动态生成的,需保证在Swagger配置完成前完成Schema的初始化。
内容的提问来源于stack exchange,提问作者aleha_84
相关产品推荐
相关产品推荐

