ble*_*aky 12 c# swashbuckle .net-5 system.text.json
我将 ASP.NET Core 与 .NET 5 一起使用,并使用System.Text.Json序列化程序来序列化包含字段的类型(例如System.Numerics.Vector3(X、Y 和 Z 是字段),尽管任何具有字段的类型在此处的行为都相同)。
我已经通过 Postman 调用 API 验证了字段正确序列化,但是 Swashbuckle 生成的 Swagger API 定义没有正确反映这一点。(定义只是显示一个空类型)
我已经创建了一个重现这一点的要点。它提供了一个 HTTP Get 方法,/api/Test该方法返回一个Test带有字段和属性的 Type 对象。两者都是字符串。通过 Postman 调用此 API 会返回两者的正确值。查看 Swagger UI at/swagger或at的定义/swagger/v1/swagger.json仅显示该属性。
此行为也适用于 Swagger UI 中的示例,其中仅包含属性。
根据文档,Swagger Generator 应自动复制 的行为System.Text.Json,该行为显式配置为序列化字段(参见第 47 行),因此我希望 Swagger 定义包含该字段。
重申一下,我使用System.Text.Json公共字段序列化类型。这行得通,我更愿意保持这样。
我尝试使用 Swashbuckle 生成返回这些序列化的 API 的文档。这仅适用于属性,而不适用于字段。
是否还有其他需要明确配置才能使其工作的内容?
似乎 Swashbuckle 不使用JsonSerializerOptions来生成文档。我发现的一种解决方法是手动处理类型:
public class FieldsSchemaFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
var fields = context.Type.GetFields();
if (fields == null) return;
if (fields.Length == 0) return;
foreach (var field in fields)
{
schema.Properties[field.Name] = new OpenApiSchema
{
// this should be mapped to an OpenApiSchema type
Type = field.FieldType.Name
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的 Startup.cs ConfigureServices 中:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
c.SchemaFilter<FieldsSchemaFilter>();
});
Run Code Online (Sandbox Code Playgroud)
当步进通过,你会看到JsonSerializerOptions在使用的SchemaFilterContext(SchemaGenerator)。IncludeFields设置为真。仍然只有属性用于文档,所以我想这样的过滤器是你最好的选择。
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |