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

JsonConvert.DeserializeObject将可空int默认设为0,如何改为null?

解决JsonConvert反序列化时可空int字段默认设为0的问题

你的问题根源在于Person类的构造函数——构造函数接收的age参数是非可空int类型,当JSON中缺失Age字段时,Json.NET会自动给这个参数传入int的默认值0,最终导致Age属性被设置为0,而非预期的null。

下面是几种可行的解决方案:

方案1:修改构造函数的age参数为可空int类型

直接把构造函数里的int age改成int? age,这样当JSON没有Age字段时,参数会传入null,赋值给Age属性:

class Person
{
    public Person(string name, int? age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; set; }

    [DataMember]
    [Range(0, 100, ErrorMessage = "Age should be between 0 and 100")]
    public int? Age { get; set; }
}

方案2:添加无参数构造函数

Json.NET优先使用无参构造函数进行实例化,再逐个赋值属性。添加无参构造函数后,缺失的Age字段会保持null:

class Person
{
    public Person() { }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; set; }

    [DataMember]
    [Range(0, 100, ErrorMessage = "Age should be between 0 and 100")]
    public int? Age { get; set; }
}

方案3:保留原构造函数并配置序列化选项

如果需要保留原构造函数,可给构造函数添加[JsonConstructor]特性,同时将参数改为可空类型,并配置序列化选项忽略默认值:

class Person
{
    [JsonConstructor]
    public Person(string name, int? age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; set; }

    [DataMember]
    [Range(0, 100, ErrorMessage = "Age should be between 0 and 100")]
    public int? Age { get; set; }
}

// 反序列化时使用配置
var settings = new JsonSerializerSettings
{
    DefaultValueHandling = DefaultValueHandling.Ignore
};
Person person = JsonConvert.DeserializeObject<Person>(json, settings);

修改后运行你的代码,person.Age在JSON缺失Age字段时会返回null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:05:25