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

如何在.NET 6 API的JSON响应中忽略空字符串?

解决方案

你的问题出在序列化的执行顺序上:DefaultIgnoreCondition的判断逻辑先于转换器执行。你写的转换器会把空字符串转为null,但此时该属性已经被判定为需要序列化,所以最终输出里还是会保留这个null值的属性,不会被忽略。

要实现只忽略null和空字符串的string属性,同时不影响数字类型的0,可以通过修改JsonTypeInfo的属性忽略逻辑来实现,不需要修改任何模型。具体步骤如下:

  1. 使用DefaultJsonTypeInfoResolver的Modifiers回调,遍历所有对象类型的属性
  2. 对每个string类型的属性,重写它的ShouldIgnore逻辑,判断属性值是否为空字符串或null
  3. 保留原有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:52:38