我有一个ASP.NET Core 3.1项目,我想在其上使用Swagger生成API文档以及可查询的示例。
我想使用新的System.Text.Json
名称空间,而不是旧的Newtonsoft.Json
名称空间
如果您正在使用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
兼容?
感谢您的回答