使 NSwag 生成的客户端中的属性可以为空

Posted

技术标签:

【中文标题】使 NSwag 生成的客户端中的属性可以为空【英文标题】:Make properties in NSwag generated client nullable 【发布时间】:2019-12-08 17:52:12 【问题描述】:

我在 (OpenApi 3.0.1) 中从供应商处获得此对象规范:

"ExampleTO" : 
  "codeValidFrom" : 
    "type" : "string",
    "format" : "date"
  

NSwag 在 C# 客户端中生成此属性(我认为是正确的):

[Newtonsoft.Json.JsonProperty("codeValidFrom",
 Required = Newtonsoft.Json.Required.DisallowNull,
 NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
[Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))]
public System.DateTimeOffset CodeValidFrom  get; set; 

问题:“codeValidFrom”中有空值。我认为规范应该是这样的:

"ExampleTO" : 
  "codeValidFrom" : 
    "type" : "string",
    "format" : "date",
    "nullable: "true"
  

供应商不想做这个添加,声称架构是生成的并且不能轻易更改。

有没有办法让 NSwag 客户端仍然可以正常工作?理想情况下,我会让所有字符串属性都可以为空。

【问题讨论】:

【参考方案1】:

我在第三方 API 中遇到了类似的问题,该问题在于其属性的可空性。我正在使用我自己编写的客户端生成器,所以我给它一个选项来使用模式访问者(在issue #1814 中讨论作为不同问题的解决方案)来清除 Swagger 文档的“必需”属性集合,从而使所有属性默认为可为空。您可能可以通过在解析 JSON 之前对其进行操作来实现相同的目的。

class RequiredVisitor : JsonSchemaVisitorBase

    protected override Task<JsonSchema4> VisitSchemaAsync(JsonSchema4 schema, string path, string typeNameHint)
    
        schema.RequiredProperties.Clear();
        return Task.FromResult(schema);
    

像这样使用它(我的代码不是一字不差,未经测试):

var doc = await SwaggerDocument.FromJsonAsync(json);
await new RequiredVisitor().VisitAsync(doc);

【讨论】:

以上是关于使 NSwag 生成的客户端中的属性可以为空的主要内容,如果未能解决你的问题,请参考以下文章

NSwag生成客户端调用代码

.NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码

如何处理 Nswag 方法的 FileResponse 返回类型

ASP.NET 核心:NSwag 与 Swashbuckle

如何在请求标头上调用需要不记名令牌的 NSwag 客户端方法?

Web Api