1

我有一个 ASP.NET Core 3.1 项目,我想在该项目上生成 API 文档以及使用 Swagger 的可查询示例。

我想使用新的System.Text.Json命名空间而不是旧Newtonsoft.Json的命名空间

Swagger 文档中所述

如果您使用 System.Text.Json (STJ),那么上述设置就足够了,Swagger 生成器将自动支持 STJ 选项/属性

如果您使用的是 Newtonsoft,那么您需要安装一个单独的包并明确选择加入,以确保 Swagger 生成器自动支持 Newtonsoft 设置/属性

我没有安装软件包Swashbuckle.AspNetCore.Newtonsoft,也没有调用services.AddSwaggerGenNewtonsoftSupport().

我的控制器的方法看起来像这样(我想将 Enums 转换为字符串值而不是整数)

/// <summary>
/// Just a test Method
/// </summary>
/// <param name="fooParams">My Params</param>
/// <returns></returns>
[HttpGet("Foo")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(FooResult))]
[SwaggerRequestExample(requestType: typeof(FooQuery), examplesProviderType: typeof(FooRequestExampleProvider), jsonConverter: typeof(System.Text.Json.Serialization.JsonStringEnumConverter))]
[SwaggerResponseExample(statusCode: 200, examplesProviderType: typeof(FooResponseExampleProvider), jsonConverter: typeof(System.Text.Json.Serialization.JsonStringEnumConverter))]
public FooResult Foo([FromQuery]FooQuery fooParams)
{
    return _processor.Execute<FooQuery, FooResult>(fooParams);
}

但是,当我执行此方法时(在我的 中调用Startup.cs

public static IApplicationBuilder UseVersionedSwagger(this IApplicationBuilder app, IApiVersionDescriptionProvider provider)
{
    app.UseSwagger();

    app.UseSwaggerUI(options =>
    {
        foreach (var description in provider.ApiVersionDescriptions)
        {
            options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
        }
    });

    return app;
}

我得到一个例外说

System.InvalidCastException

H结果=0x80004002

消息=无法将“System.Text.Json.Serialization.JsonStringEnumConverter”类型的对象转换为“Newtonsoft.Json.JsonConverter”类型。来源=Swashbuckle.AspNetCore.Filters

这是我在我的.csproj

<PackageReference Include="FluentValidation.AspNetCore" Version="8.6.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.1.1" />
<PackageReference Include="Microsoft.Extensions.ApiDescription.Server" Version="3.1.0">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Rebus.RabbitMq" Version="5.2.0" />
<PackageReference Include="SimpleInjector.Integration.AspNetCore.Mvc" Version="4.8.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc5" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="5.0.0-rc9" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.0.0-rc5" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.0.0-rc5" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUi" Version="5.0.0-rc5" />

如果我改变我的控制器的方法来使用Newtonsoft.Json它工作得很好,也不例外

/// <summary>
/// Just a test Method
/// </summary>
/// <param name="fooParams">My Params</param>
/// <returns></returns>
[HttpGet("Foo")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(FooResult))]
[SwaggerRequestExample(requestType: typeof(FooQuery), examplesProviderType: typeof(FooRequestExampleProvider), jsonConverter: typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
[[SwaggerResponseExample(statusCode: 200, examplesProviderType: typeof(FooResponseExampleProvider), jsonConverter: typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public FooResult Foo([FromQuery]FooQuery fooParams)
{
    return _processor.Execute<FooQuery, FooResult>(fooParams);
}

我什至试图在我的Startup.cs

services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
    });

但我仍然无法使用System.Text.Json.Serialization.JsonStringEnumConverter,只能使用Newtonsoft.Json.Converters.StringEnumConverter

这是我的FooQuery类,其中包含一个FooEnum我想在 Swagger 中转换为字符串值的属性

public class FooQuery
{
    public string Code { get; set; }

    public FooEnum MyFooParam { get; set; }
}

那么我的代码在某处不正确吗?我错过了什么?

还是Swashbuckle.AspNetCore.Filters包裹有问题?这个包的版本是否有5.0.0-rc9问题并且还不兼容System.Text.Json.Serialization.JsonStringEnumConverter

感谢您的回答

4

0 回答 0