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

