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

