SwaggerUI 5.0.0忽略JsonProperty名称

16

我最近将一个 ASP.NET Core API 应用程序升级到了与 ASP.NET Core 3.1 兼容的 Swashbuckle/Swagger 5.0.0 版本。

<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="5.0.0" />

然而,这样做后,我注意到Swagger UI现在忽略了DTO属性上的Newtonsoft/JSON.NET JsonProperty属性名。例如:

[HttpGet("testget", Name = "testget")]
[ProducesResponseType(StatusCodes.Status200OK)]
public ActionResult<TestGetResponse> TestGet()
{
    var response = new TestGetResponse { MyName = "John" };

    return Ok(response);
}

public class TestGetResponse
{
    [JsonProperty("name")]
    public string MyName { get; set; }
}

在Swagger UI中输出的内容如下:

状态码 200: 示例数值

Model
{
  "myName": "string"
}

不是Model属性名称 name

对于在Startup.cs ConfigureServices中的Swagger,我目前有:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "My API",
    });

    c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"));
});

对于Startup.cs中的Swagger配置,我目前有以下内容:

app.UseSwagger();

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API");
    c.RoutePrefix = "swagger";
});

我知道如果我使用JsonPropertyName属性来自System.Text.Json,问题就会得到解决,但是目前我需要坚持使用原始属性。

在Start.cs中是否有设置可以告诉SwaggerUI使用Newtonsoft的JsonProperty属性?还是说我需要更改ASP.NET Core的配置级别的一些东西?

1个回答

47
似乎Swashbuckle/Swagger的5.0.0版本开始对Newtonsoft JSON.net提供全面支持,但需要使用一个单独的包实现。
要实现此功能:
1) 安装 nuget 包 Swashbuckle.AspNetCore.Newtonsoft 版本为 5.0.0 或更高版本。
2) 在 Startup.ConfigureServices() 中调用以下代码以获得支持:

services.AddSwaggerGenNewtonsoftSupport();

更多信息请点击这里

1
我认为虽然这个解释比较旧,但我已经尝试过了,仍然没有成功。我正在运行swagger包的5.5.1版本。有人对此有进一步的说明吗? - Frank Thomas
我也遇到了Asp.Net Core 3.1和NSwag Nuget包的相同问题。当我在Postman中尝试时一切正常,但是在Swagger UI中它会将占位符传递给请求而不是参数值,并且它不会识别查询字符串参数中的JsonProperty("MyName")。 - Lupa
@bytedev,您说的不调用“AddNewtonsoftJson”是什么意思?这是指aspnetcore如何配置使用newtonsoftjson包吗? - liang
@liang,感谢您发现了这个错误。我已经删除了我的旧评论。 - bytedev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接