如何配置NSwag使OpenAPI可空属性序列化时包含Null值?
问题解决:NSwag生成代码时指定属性NullValueHandling为Include
问题背景
在OpenAPI文档中,我已将属性定义为可空,示例如下:
"PersonBirthdate": { "type": "string", "nullable": true, "format": "date" }
但NSwag据此生成的代码中,NullValueHandling默认设为Ignore:
[Newtonsoft.Json.JsonProperty("PersonBirthdate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] [Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))]
而我需要生成的代码是将NullValueHandling设为Include:
[Newtonsoft.Json.JsonProperty("PersonBirthdate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Include)] [Newtonsoft.Json.JsonConverter(typeof(DateFormatConverter))]
实现方案
通过NSwag提供的partial方法UpdateJsonSerializerSettings,自定义ContractResolver来为指定属性设置NullValueHandling = Include,代码如下:
partial void UpdateJsonSerializerSettings(JsonSerializerSettings settings) { settings.ContractResolver = new CustomContractResolver(); } internal class CustomContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); switch(property.PropertyName) { //Account case "PersonBirthdate": property.NullValueHandling = NullValueHandling.Include; property.Required = Required.Default; break; case "EmailOptInDate__pc": property.NullValueHandling = NullValueHandling.Include; property.Required = Required.Default; break; case "EmailDoubleOptInDate__pc": property.NullValueHandling = NullValueHandling.Include; property.Required = Required.Default; break; //Contact case "Birthdate": property.NullValueHandling = NullValueHandling.Include; property.Required = Required.Default; break; case "EmailOptInDate__c": property.NullValueHandling = NullValueHandling.Include; property.Required = Required.Default; break; case "EmailDoubleOptInDate__c": property.NullValueHandling = NullValueHandling.Include; property.Required = Required.Default; break; } return property; } }
内容的提问来源于stack exchange,提问作者user3644868
相关产品推荐
相关产品推荐

