Swashbuckle API 定义中未显示 .NET 5 中的 System.Text.Json 字段序列化

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 的文档。这仅适用于属性,而不适用于字段。

是否还有其他需要明确配置才能使其工作的内容?

Mar*_*sch 7

似乎 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在使用的SchemaFilterContextSchemaGenerator)。IncludeFields设置为真。仍然只有属性用于文档,所以我想这样的过滤器是你最好的选择。

  • 酷解决方案,没有意识到这一点。谢谢 (2认同)