如何在.NET 6 API的JSON响应中忽略空字符串?
解决方案
你的问题出在序列化的执行顺序上:DefaultIgnoreCondition的判断逻辑先于转换器执行。你写的转换器会把空字符串转为null,但此时该属性已经被判定为需要序列化,所以最终输出里还是会保留这个null值的属性,不会被忽略。
要实现只忽略null和空字符串的string属性,同时不影响数字类型的0,可以通过修改JsonTypeInfo的属性忽略逻辑来实现,不需要修改任何模型。具体步骤如下:
- 使用
DefaultJsonTypeInfoResolver的Modifiers回调,遍历所有对象类型的属性 - 对每个string类型的属性,重写它的
ShouldIgnore逻辑,判断属性值是否为空字符串或null - 保留原有的
DefaultIgnoreCondition逻辑,确保null值的非string属性也会被忽略
完整配置代码如下:
_ = services.AddControllers().AddJsonOptions(options => { // 保留原有忽略null的逻辑 options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; // 注册类型信息修改器,处理string属性的空字符串忽略 options.JsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { typeInfo => { // 只处理对象类型的元信息 if (typeInfo.Kind != JsonTypeInfoKind.Object) return; foreach (var property in typeInfo.Properties) { // 仅针对string类型的属性 if (property.PropertyType == typeof(string)) { // 保存原本的忽略判断逻辑 var originalShouldIgnore = property.ShouldIgnore; // 重写忽略条件:原有条件成立,或者当前属性值是空/空字符串 property.ShouldIgnore = obj => { // 先执行原有判断(比如是否为null) if (originalShouldIgnore?.Invoke(obj) == true) return true; // 获取当前属性的值 var stringValue = property.GetValue(obj) as string; // 判断是否为空或空字符串 return string.IsNullOrEmpty(stringValue); }; } } } } }; });
为什么这个方法可行?
- 直接在属性序列化的前置判断阶段就决定是否忽略,不需要通过转换器转null再处理
- 仅针对string类型的属性生效,不会影响数字、布尔等其他类型的属性(比如数字0会正常保留)
- 不需要修改任何模型类,所有配置集中在Startup/Program.cs里完成
内容的提问来源于stack exchange,提问作者Clive Cauchi
相关产品推荐
相关产品推荐

