.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

