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

如何在JSON序列化时忽略默认值为true的bool属性?

问题分析与解决方案

问题原因

你使用的JsonIgnoreCondition.WhenWritingDefault规则,判断的是CLR类型的默认值(bool类型的默认值为false),而非你为属性定义的自定义默认值true。因此当BoolProperty的值为true时,序列化器不会将其判定为“默认值”,也就不会忽略该属性。

解决方案

方案1:.NET 7+ 专用(推荐)

.NET 7及更高版本的System.Text.Json新增了JsonPropertyDefaultValueAttribute,可指定属性的自定义默认值,配合JsonIgnoreCondition.WhenWritingDefault即可实现需求:

private record MyRecord()
{
    [JsonPropertyDefaultValue(true)]
    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
    public bool BoolProperty { get; init; } = true;
}

序列化代码无需修改,此时当BoolProperty为true时会被忽略,输出空JSON对象;若属性值为false,则会正常序列化该字段。

方案2:兼容.NET 6及以下版本

自定义一个JsonConverter,仅在属性值为false时进行序列化:

public class BoolTrueIgnoreConverter : JsonConverter<bool>
{
    public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.GetBoolean();
    }

    public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
    {
        // 仅当值为false时写入JSON
        if (!value)
        {
            writer.WriteBooleanValue(value);
        }
    }
}

将转换器应用到目标属性:

private record MyRecord()
{
    [JsonConverter(typeof(BoolTrueIgnoreConverter))]
    public bool BoolProperty { get; init; } = true;
}

也可以全局注册转换器(适用于多个属性需要相同规则的场景):

JsonSerializerOptions options = new();
options.Converters.Add(new BoolTrueIgnoreConverter());

验证效果

使用上述方案后,执行你的序列化代码:

MyRecord obj = new();
string json = JsonSerializer.Serialize(obj, options);

输出结果为{},符合预期;若设置obj = new MyRecord { BoolProperty = false },则输出{"BoolProperty":false}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:40:09