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
相关产品推荐
相关产品推荐

