尝试使用System.Text.Json.Serialization.JsonStringEnumConverter时,Swashbuckle.AspNetCore.Filters引发异常

时间:2020-01-02 10:09:24

标签: asp.net-core json.net swagger swashbuckle system.text.json

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

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

Swagger documentation

中所述

如果您正在使用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

HResult = 0x80004002

Message =无法将类型为“ System.Text.Json.Serialization.JsonStringEnumConverter”的对象转换为类型为“ Newtonsoft.Json.JsonConverter”的对象。 Source = 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类,其中包含一个我想在Swagger中转换为字符串值的FooEnum属性

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兼容?

感谢您的回答

0 个答案:

没有答案