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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:26:11