如何在.NET6中从appsettings.json加载空对象到配置类字典属性
问题原因
.NET 默认的配置绑定逻辑中,BinderOptions.BindEmptyInstances 属性默认值为 false,空JSON对象{}会被绑定器判定为无有效可绑定属性,不会被添加到字典中,这就是OptionOne条目丢失的原因。
另外注意你当前的绑定代码存在笔误:你定义的选项类是CustomOptions,但代码中绑定的是EndpointOptions,需要先修正为对应类型。
解决方案
方案1:修改绑定配置(推荐,无需改动appsettings.json)
在绑定时显式开启空对象绑定即可,修改Program.cs中的绑定代码:
// 注意替换为你自己的CustomOptions.Key常量,或者直接传字符串"CustomOptions" builder.Services.AddOptions<CustomOptions>() .Bind(builder.Configuration.GetSection(CustomOptions.Key), binderOptions => { binderOptions.BindEmptyInstances = true; });
开启后,空的OptionOne节点会被自动实例化为默认的CustomInfo对象,你定义的字段默认值(空字典、空列表)都会保留,完全符合你后续新增配置项的需求,所有空配置节点都会被正常加载到字典中。
方案2:修改appsettings.json
如果不想改动代码,可以给空配置项显式添加至少一个空属性,触发绑定逻辑:
"CustomOptions" : { "MyOptions": { "OptionOne": { "DictionaryField": {} }, "OptionTwo": { "DictionaryField": { "ValueOne": "somevalue", "ValueTwo": "someothervalue" }, "ListField": [ "ListItem" ] } } }
验证效果
修改完成后,注入的IOptions<CustomOptions>实例中,MyOptions字典会包含OptionOne和OptionTwo两个键,OptionOne对应的CustomInfo实例会使用你定义的默认值。
内容的提问来源于stack exchange,提问作者not_only_but_also
相关产品推荐
相关产品推荐

