在ASP.NET Core中,Swagger默认不会显示拆分的数组对象,但可以通过自定义Swagger的SchemaFilter来解决这个问题。
下面是一个示例的解决方法。
首先,创建一个自定义的SchemaFilter类,例如SplitArrayObjectSchemaFilter:
using System;
using System.Linq;
using System.Reflection;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
public class SplitArrayObjectSchemaFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
var propertiesToRemove = schema.Properties
.Where(p => p.Value.Type == "array" && p.Value.Items.Type == "object")
.Select(p => p.Key)
.ToList();
foreach (var propertyToRemove in propertiesToRemove)
{
schema.Properties.Remove(propertyToRemove);
var splitProperties = context.Type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.Name.StartsWith(propertyToRemove + "[") && p.PropertyType.IsClass && p.PropertyType != typeof(string))
.ToList();
foreach (var splitProperty in splitProperties)
{
var splitPropertySchema = context.SchemaGenerator.GenerateSchema(splitProperty.PropertyType, context.SchemaRepository);
schema.Properties.Add(splitProperty.Name, splitPropertySchema);
}
}
}
}
然后,在Startup.cs文件中的ConfigureServices方法中注册该SchemaFilter:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
c.SchemaFilter();
});
// ...
}
这样,在使用Swagger生成API文档时,拆分的数组对象将会显示出来。