如何配置JsonConvert忽略特定整数值?用Integer类型最小值替代0为默认
如何让JsonConvert忽略值为Integer最小值的字段(保留0作为有效值)
当然可以搞定这个需求!因为默认的JsonConvert没有直接提供忽略特定数值的开关,所以我们需要自定义一些逻辑来实现——下面给你两种实用的方案,分别适合全局设置和单个字段控制的场景:
方案一:全局生效的自定义ContractResolver
如果你希望所有int类型的字段都遵循“忽略int.MinValue,保留0”的规则,推荐用这种方式,只需要配置一次就能全局生效:
首先创建一个继承自DefaultContractResolver的自定义解析器,重写属性创建逻辑:
public class IgnoreIntMinValueResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); // 只针对非可空int类型的属性 if (property.PropertyType == typeof(int)) { // 将默认值设为int的最小值(-2147483648) property.DefaultValue = int.MinValue; // 只有当属性值不等于这个默认值时,才序列化该字段 property.ShouldSerialize = instance => { var value = (int)member.GetValue(instance); return value != int.MinValue; }; } // 如果需要支持可空int(int?),可以加上下面的判断 else if (property.PropertyType == typeof(int?)) { property.ShouldSerialize = instance => { var value = (int?)member.GetValue(instance); return value != null && value != int.MinValue; }; } return property; } }
然后在序列化的时候,把这个解析器配置到JsonSerializerSettings里:
var serializerSettings = new JsonSerializerSettings { ContractResolver = new IgnoreIntMinValueResolver(), DefaultValueHandling = DefaultValueHandling.Ignore // 配合这个设置确保默认值不会被序列化 }; // 序列化你的对象 var jsonString = JsonConvert.SerializeObject(yourTargetObject, serializerSettings);
这样一来,所有值为int.MinValue的int字段都会被自动忽略,而0作为有效值会被正常序列化。
方案二:单个字段生效的自定义JsonConverter
如果你只需要给特定的几个字段设置这个规则,用自定义转换器更灵活:
先创建一个针对int类型的Json转换器:
public class IgnoreIntMinValueConverter : JsonConverter<int> { public override void WriteJson(JsonWriter writer, int value, JsonSerializer serializer) { // 只有当值不是int.MinValue时,才写入JSON if (value != int.MinValue) { writer.WriteValue(value); } // 否则不写入,相当于忽略该字段 } public override int ReadJson(JsonReader reader, Type objectType, int existingValue, bool hasExistingValue, JsonSerializer serializer) { // 反序列化时,如果字段不存在,返回int.MinValue作为默认值 if (reader.TokenType is JsonToken.Null or JsonToken.Undefined) { return int.MinValue; } return Convert.ToInt32(reader.Value); } }
然后在需要应用规则的属性上加上[JsonConverter]特性即可:
public class YourBusinessClass { // 这个字段值为0时会被正常序列化 public int ValidZeroField { get; set; } = 0; // 这个字段值为int.MinValue时会被忽略,其他值正常序列化 [JsonConverter(typeof(IgnoreIntMinValueConverter))] public int DefaultMinValueField { get; set; } = int.MinValue; // 这个字段值为123时会被正常序列化 [JsonConverter(typeof(IgnoreIntMinValueConverter))] public int NormalValueField { get; set; } = 123; }
小提示
如果你的场景里需要处理可空int(int?),只需要把转换器改成继承JsonConverter<int?>,然后调整读写逻辑即可,思路和上面一致。
内容的提问来源于stack exchange,提问作者JohnCambell
相关产品推荐
相关产品推荐

