当前位置: 首页 > 知识库问答 >
问题:

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

顾宣
2023-03-14

我创造了一个重现这一点的要点。它在/api/test提供了一个HTTP Get方法,该方法返回test类型的对象,其中包含一个字段和一个属性。两者都是字符串。通过Postman调用这个API,将返回两者的正确值。查看/Swagger中的Swagger UI或/Swagger/v1/Swagger.json中的定义只显示该属性。

这种行为也适用于Swagger UI中的示例,这些示例只包含属性。

根据文档,Swagger生成器应该自动复制system.text.json的行为,system.text.json被显式配置为序列化字段(请参见第47行),因此我希望Swagger定义包括字段。

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

是否还有其他需要显式配置的东西才能起作用?

共有1个答案

司寇阳朔
2023-03-14

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>();
});

逐步执行时,您将看到SchemaFilterContext(SchemaGenerator)中使用的JSONSerializerOptionsIncludeFields设置为true。仍然只有属性用于文档,所以我想像这样的过滤器是你最好的选择。

 类似资料:
  • 我需要编写一个方法,它接受一些对象、给定对象的类中存在的一些字段名和一些字段值。该值是字段的JSON序列化形式。该方法将获取该值并相应地反序列化它,如下所示: (我实际上只需要检索反序列化的值,而不需要重新设置它,但这使它成为一个更好的示例。)只要Jackson默认的反序列化足够,这就行了。现在让我们假设我有一个带有自定义(de)序列化程序的类: 一个可能的解决方案是手动检查注释。但是,我真的不想

  • 有没有一种方法可以使用Jackson JSON处理器来执行自定义字段级别的序列化?例如,我想让 注意,age=25被编码为数字,而favoritenumber=123被编码为字符串。Jackson将编组为一个数字。在这种情况下,我希望将favoriteNumber编码为字符串。

  • 我试图使用Gson自定义序列化将以下类序列化为Json。

  • 问题内容: 尝试通过关联获取时,“字段列表”中出现未知列“ userDetails.createdAt”。 无需关联即可正常使用。 我的代码如下: 问题答案: 我认为错误是您在序列化中启用了时间戳,但是数据库中的实际表定义不包含时间戳列。 当您执行user.find时,它只会执行,而只接受您实际拥有的列。但是,当您联接时,联接表的每一列都将被别名,这将创建以下查询: 解决方法是禁用任一userDe

  • 考虑一个案例,我有2个对象映射器实例。我希望必须从序列化中排除使用某些自定义注释注释的字段,而其他映射器包含(忽略注释) 就像类有3个字段a,b,c和c用一些注释注释(比如@IgnoreField)(它们的n个类,每个类都有它们不应该被序列化的字段) 现在,第一个对象映射器 o1 必须仅序列化 a 和 b。而第二个对象映射器o2可以序列化a,b和c。 任何具有不同字段的类都可能发生这种情况,其中一

  • 我是新来的wordpress, im创建一个自定义职位与字段的custom_meta_box(位置,着装) 所以在我的自定义帖子列表中,我想查看我在custom_meta_box上创造的价值。 这是我目前的代码: