c# - .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 的文档。这仅适用于属性,但不适用于字段。
是否需要明确配置其他内容才能使其正常工作?
解决方案
似乎 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
使用的。设置为真。文档仍然只使用属性,所以我想这样的过滤器是你最好的选择。SchemaFilterContext
SchemaGenerator
IncludeFields
推荐阅读
- r - 条件长度警告
- java - MojoExecutionException Maven
- vue.js - Vuetify 文本字段在首次加载时显示值和标签,因为自动填充
- python - 是否可以使用不同的名称实现父类方法?
- python - 努力编写一个在列表中查找相同数据的“集群”的函数
- python - 如何使用pyside6制作像代码输入这样的小部件
- javascript - Node js网站+ sql:插入/更新用户名(键)和表上的分数
- javascript - 谷歌数据工作室 JavaScript myViz.json 多维度设置
- node.js - Liferay 7.1 主题创建:命令失败:C:\Windows\system32\cmd.exe /s /c "yo "--version""
- javascript - 在 Javascript 中的嵌套对象中查找分支