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

C# Azure Function配置JSON序列化无法忽略空字符串问题排查

问题根因

你当前配置不生效有两个核心原因:

  1. DefaultValueHandling.Ignore 规则只会在属性值等于类型系统默认值时才会跳过序列化,string 类型的系统默认值是null,空字符串""是显式赋值的非null值,和默认值不匹配,因此不会被该规则过滤。
  2. 你代码中AddJsonOptions配置的是System.Text.Json序列化器的规则,但.NET Core 3.1版本的进程内Azure Function默认走你配置的Newtonsoft.Json序列化流程,这部分配置本身不会生效,且.NET Core 3.1版本的System.Text.Json没有内置忽略空字符串的开关,实现成本更高。
解决方案

推荐直接基于你当前使用的Newtonsoft.Json做全局配置,无需改动现有业务模型。

全局生效方案

第一步:自定义支持空字符串过滤的契约解析器

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Reflection;

public class IgnoreEmptyStringResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        // 仅针对string类型属性追加空值判断
        if (property.PropertyType == typeof(string))
        {
            property.ShouldSerialize = instance => 
            {
                var value = property.ValueProvider.GetValue(instance) as string;
                return !string.IsNullOrEmpty(value);
            };
        }
        return property;
    }
}

第二步:替换Startup中原有的契约解析器配置

builder.Services.AddMvcCore()
    .AddNewtonsoftJson(options =>
    {
        options.UseMemberCasing();
        // 替换为自定义解析器,同时支持null、空字符串忽略
        options.SerializerSettings.ContractResolver = new IgnoreEmptyStringResolver();
        options.SerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
        options.SerializerSettings.Formatting = Formatting.Indented;
        options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore;
        options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    });

配置完成后,所有string类型的属性值为null或者""时都会被自动忽略,不会出现在序列化结果中。

单属性生效方案

如果不需要全局过滤,只需要给指定属性加特性即可,无需自定义解析器:

using Newtonsoft.Json;
using System.ComponentModel;

public class YourBusinessModel
{
    // 标记空字符串为默认值,配合DefaultValueHandling规则忽略
    [DefaultValue("")]
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public string OptionalField { get; set; }
}

注意:如果你后续要切换到System.Text.Json实现相同效果,需要自定义JsonConverter<string>做空值判断,在写入时跳过空字符串值,.NET 5+版本才新增了JsonIgnoreCondition.WhenWritingDefault等更细粒度的忽略规则,.NET Core 3.1版本不支持。

内容的提问来源于stack exchange,提问作者JhotaMS Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:54:34