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

如何通过System.Text.Json全局仅忽略值为false的布尔类型字段?

全局忽略System.Text.Json中值为false的布尔字段方案

默认的JsonIgnoreCondition.WhenWritingDefault会忽略所有类型的默认值(比如int的0、string的空字符串),无法满足仅忽略布尔类型false的需求。可以通过自定义类型信息解析器实现全局配置,无需逐个给布尔属性添加特性:

1. 自定义类型信息解析器(处理非可空布尔类型)

创建继承自DefaultJsonTypeInfoResolver的解析器,仅对布尔类型属性设置忽略默认值规则:

using System.Text.Json;
using System.Text.Json.Serialization;

public class BoolOnlyIgnoreDefaultResolver : DefaultJsonTypeInfoResolver
{
    public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options)
    {
        var typeInfo = base.GetTypeInfo(type, options);
        
        foreach (var property in typeInfo.Properties)
        {
            // 仅对非可空布尔类型设置忽略false的规则
            if (property.PropertyType == typeof(bool))
            {
                property.IgnoreCondition = JsonIgnoreCondition.WhenWritingDefault;
            }
            // 其他类型保留原有序列化逻辑
        }
        
        return typeInfo;
    }
}

2. 配置并使用序列化选项

在JsonSerializerOptions中指定自定义解析器,无需设置全局DefaultIgnoreCondition:

var options = new JsonSerializerOptions
{
    TypeInfoResolver = new BoolOnlyIgnoreDefaultResolver()
};

// 测试序列化
var testObj = new 
{
    IsActive = false,       // 该字段会被忽略
    Age = 0,                // 默认值0会被保留
    Name = "",              // 默认值空字符串会被保留
    IsVerified = true       // 该字段会被保留
};

string jsonResult = JsonSerializer.Serialize(testObj, options);
// 输出:{"Age":0,"Name":"","IsVerified":true}

3. 扩展:处理可空布尔类型(bool?)

如果需要同时忽略可空布尔类型中值为false的情况,需搭配自定义转换器(因为WhenWritingDefault对bool?的默认值是null而非false):

自定义可空布尔转换器

public class NullableBoolConverter : JsonConverter<bool?>
{
    public override bool? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.TokenType == JsonTokenType.Null ? null : reader.GetBoolean();
    }

    public override void Write(Utf8JsonWriter writer, bool? value, JsonSerializerOptions options)
    {
        // 仅当值不为false时写入字段
        if (value != false)
        {
            if (value.HasValue)
                writer.WriteBooleanValue(value.Value);
            else
                writer.WriteNullValue();
        }
    }
}

更新序列化选项

var options = new JsonSerializerOptions
{
    TypeInfoResolver = new BoolOnlyIgnoreDefaultResolver(),
    Converters = { new NullableBoolConverter() }
};

这样无论非可空布尔的false还是可空布尔的false都会被忽略,其他类型的默认值则正常保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:52:28