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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:15:55