如何在ASP.NET Core中区分appsettings.json数组属性的空、Null与未设置
解决ASP.NET Core 9.0中配置数组的三种状态区分问题
默认使用Microsoft.Extensions.Configuration绑定配置类时,无法区分数组节点不存在、数组显式设为null、**数组设为空数组[]**三种情况,都会将属性设为null。要实现前两种情况返回null、空数组返回string[0],可以通过以下两种方式解决:
方法一:手动检查配置节点并处理
先完成常规绑定,再针对Bar节点单独判断处理:
var configuration = builder.Configuration; var mySettings = new MySettings(); // 绑定基础配置 configuration.GetSection("MySettings").Bind(mySettings); // 处理Bar属性 var barSection = configuration.GetSection("MySettings:Bar"); if (barSection.Exists()) { // 获取节点原始JSON值,判断是否显式设为null var rawJson = barSection.GetRawJson(); if (string.Equals(rawJson?.Trim(), "null", StringComparison.OrdinalIgnoreCase)) { // 情况B:保持Bar为null mySettings.Bar = null; } else { // 情况C:绑定数组,空数组会转为string[0] mySettings.Bar = barSection.Get<string[]>() ?? Array.Empty<string>(); } } // 情况A:Bar节点不存在,保持Bar为null
方法二:自定义配置转换器
实现IConfigurationConverter<string[]>来处理数组的绑定逻辑,复用性更强:
1. 定义转换器类
public class StringArrayConfigurationConverter : IConfigurationConverter<string[]> { public string[] Convert(IConfigurationSection section) { if (!section.Exists()) { // 情况A:节点不存在,返回null return null; } var rawJson = section.GetRawJson(); if (string.Equals(rawJson?.Trim(), "null", StringComparison.OrdinalIgnoreCase)) { // 情况B:显式设为null,返回null return null; } // 情况C:绑定数组,空数组返回string[0] return section.Get<string[]>() ?? Array.Empty<string>(); } }
2. 使用转换器绑定配置
var configuration = builder.Configuration; var mySettings = configuration.GetSection("MySettings").Get<MySettings>(options => { options.Converters.Add(new StringArrayConfigurationConverter()); });
关键说明
GetRawJson()方法用于获取配置节点的原始JSON内容,能准确判断是否显式设置为null;- 对于空数组
[],section.Get<string[]>()会返回空数组string[0],无需额外处理; - 两种方法都能精准区分三种场景,方法二更适合需要多处复用的场景。
内容的提问来源于stack exchange,提问作者LWChris
相关产品推荐
相关产品推荐

