我有一个 ASP.NET Core 3.1 项目,我想在该项目上生成 API 文档以及使用 Swagger 的可查询示例。
我想使用新的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
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
?
感谢您的回答