C# Azure Function配置JSON序列化无法忽略空字符串问题排查
问题根因
你当前配置不生效有两个核心原因:
DefaultValueHandling.Ignore规则只会在属性值等于类型系统默认值时才会跳过序列化,string类型的系统默认值是null,空字符串""是显式赋值的非null值,和默认值不匹配,因此不会被该规则过滤。- 你代码中
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
相关产品推荐
相关产品推荐

