.NET Core 6/7如何从appsettings绑定含Null值的列表?
.NET Core 6/7 绑定包含Null值的列表问题解决
问题原因
JSON配置中的null数组元素会被.NET配置系统解析为空字符串条目(如"parameters:0": ""),而默认的列表绑定逻辑会跳过这些空值条目,仅保留有有效数据的元素,导致最终List只包含1个元素而非预期的3个(前两个为Null)。
解决方案
通过自定义配置绑定逻辑,手动遍历配置节的索引节点,将空字符串条目转换为Null元素添加到列表中。
方法1:手动构建列表并注册为IOptions
在ConfigureServices中替换默认的配置绑定逻辑,手动遍历配置节点并构建列表:
services.AddSingleton<IOptions<ParameterDefinition>>(sp => { var parametersSection = Configuration.GetSection("parameters"); var parameterList = new ParameterDefinition(); int index = 0; while (parametersSection.GetSection(index.ToString()).Exists()) { var itemSection = parametersSection.GetSection(index.ToString()); if (string.IsNullOrEmpty(itemSection.Value)) { // 空字符串对应原JSON中的null,添加Null元素 parameterList.Add(null); } else { // 绑定有效配置到Parameter对象 var param = itemSection.Get<Parameter>(); parameterList.Add(param); } index++; } return Options.Create(parameterList); });
方法2:使用自定义绑定回调
通过Configure方法的重载,传入自定义绑定回调逻辑:
services.Configure<ParameterDefinition>(Configuration.GetSection("parameters"), binderOptions => { binderOptions.BindCallback = async (binder, bindingContext) => { var parametersSection = bindingContext.Configuration; var parameterList = new ParameterDefinition(); int index = 0; while (parametersSection.GetSection(index.ToString()).Exists()) { var itemSection = parametersSection.GetSection(index.ToString()); if (string.IsNullOrEmpty(itemSection.Value)) { parameterList.Add(null); } else { var param = new Parameter(); await binder.BindAsync(itemSection, param); parameterList.Add(param); } index++; } bindingContext.Result = parameterList; }; });
内容的提问来源于stack exchange,提问作者Garfield
相关产品推荐
相关产品推荐

