You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 WebAPI中NSwag生成Client字符串Required属性问题

问题

我有一个.NET 8.0 WebAPI项目,使用NSwag生成C# SDK的APIClient类供其他项目交互。NSwag会为所有字符串属性自动添加如下特性:

[Newtonsoft.Json.JsonProperty("longUrl", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string LongUrl{ get; set; }

调用客户端反序列化JSON时,若接口返回的JSON未提供该字符串字段,反序列化会失败。手动将Required = Newtonsoft.Json.Required.DisallowNull改为Newtonsoft.Json.Required.Default可解决问题,但每次构建后手动修改整个文件过于繁琐。想了解两种解决方向的可行性:是需要把DTO的字符串标记为可空类型(如string? LongUrl { get; set; }),还是可以让NSwag默认使用Default作为Required的取值?

解决方案

方法1:修改DTO的可空引用类型

将WebAPI项目中DTO的字符串属性改为可空引用类型(string?),NSwag生成SDK时会自动识别该标记,将Required属性设置为Default。示例:

// 原DTO属性
public string LongUrl { get; set; }

// 修改后的可空属性
public string? LongUrl { get; set; }

修改后生成的APIClient类特性会变为:

[Newtonsoft.Json.JsonProperty("longUrl", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string? LongUrl{ get; set; }

这种方式符合.NET 8的可空引用类型规范,从根源上解决问题,无需额外配置NSwag。

方法2:配置NSwag全局默认值

如果不想修改DTO的可空类型,可直接在NSwag配置文件(如nswag.json)中修改生成规则,强制将所有属性的Required默认值设为Default。

打开nswag.json,找到CSharpClientGeneratorSettings节点,添加或修改以下配置:

"CSharpClientGeneratorSettings": {
  // 其他已有配置...
  "JsonPropertyRequiredDefault": "Default",
  "GenerateNullableReferenceTypes": true
}

若使用代码配置NSwag(如Program.cs或专门配置类),可设置:

settings.JsonPropertyRequiredDefault = Newtonsoft.Json.Required.Default;
settings.GenerateNullableReferenceTypes = true;

配置生效后,NSwag生成所有属性时,Required的默认值都会变为Default,无需手动修改生成文件。

内容的提问来源于stack exchange,提问作者glenho123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:52:34