首页 > 解决方案 > .NET 5 中的 System.Text.Json 字段序列化未在 Swashbuckle API 定义中显示

问题描述

问题

我将 ASP.NET Core 与 .NET 5 一起使用,并且正在使用System.Text.Json序列化程序来序列化包含字段的类型(例如System.Numerics.Vector3(X、Y 和 Z 是字段),尽管任何带有字段的类型在此处的行为都相同)。

我已经通过 Postman 调用 API 验证了字段可以正确序列化,但是 Swashbuckle 生成的 Swagger API 定义没有正确反映这一点。(定义只显示一个空类型)

复制品

我创建了一个重现这一点的要点。它提供了一个 HTTP Get 方法,该方法返回一个带有字段和属性/api/Test的 Type 对象。Test两者都是字符串。通过 Postman 调用此 API 会返回两者的正确值。查看 Swagger UI/swagger或定义/swagger/v1/swagger.json仅显示属性。

此行为也适用于 Swagger UI 中的示例,其中仅包含属性。

预期行为

根据文档,Swagger 生成器应该自动复制 的行为System.Text.Json,该行为被明确配置为序列化字段(参见第 47 行),所以我希望 Swagger 定义包含该字段。

概括

重申一下,我使用System.Text.Json公共字段序列化类型。这行得通,我宁愿保持这样。

我尝试使用 Swashbuckle 生成返回这些序列化的 API 的文档。这仅适用于属性,但不适用于字段。

是否需要明确配置其他内容才能使其正常工作?

标签: c#swashbucklesystem.text.json.net-5

解决方案


似乎 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
            };
        }
    }
}

然后在您的 Startup.cs ConfigureServices 中:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
    c.SchemaFilter<FieldsSchemaFilter>();
});

单步执行时,您会看到( ) 中JsonSerializerOptions使用的。设置为真。文档仍然只使用属性,所以我想这样的过滤器是你最好的选择。SchemaFilterContextSchemaGeneratorIncludeFields


推荐阅读