.NET 7控制台应用如何从appsettings.json读取数组/列表
.NET 7控制台读取appsettings数组失败的解决方法
问题根源
你的代码里有几个关键错误导致数组绑定失败:
- 类名不匹配:代码中声明的是
List<SiteDetails>,但实际定义的实体类是Sites,类型不匹配无法完成绑定 - Bind方法调用错误:
config.GetSection("Sites")已经定位到Sites节点,调用Bind时不需要再传"Sites"参数,错误的参数直接导致绑定失效 - Settings类属性名不匹配:配置里的
IsValid和类里的IsValue名称不一致,虽然你说Settings绑定正常,但这个属性实际无法正确赋值
修正步骤
统一实体类名称
把实体类Sites改名为SiteDetail(更符合单个实体的命名规范),或者把代码中的List<SiteDetails>改成List<Sites>。推荐前者:public class SiteDetail { public string site { get; set; } public string dateFormat { get; set; } public string timeFormat { get; set; } }修正Bind方法调用
直接对List<SiteDetail>对象进行绑定,不需要额外传递节点名称:var siteDetails = new List<SiteDetail>(); config.GetSection("Sites").Bind(siteDetails);或者用更简洁的
Get<T>()方法,无需提前实例化列表:var siteDetails = config.GetSection("Sites").Get<List<SiteDetail>>();修正Settings类属性名
把IsValue改成IsValid,和配置文件中的键名保持一致:public class Settings { public string Name { get; set; } public bool IsValid { get; set; } public int Counter { get; set; } }优化配置获取方式(可选)
既然已经创建了Host,直接从Host的服务中获取IConfiguration即可,无需重新构建配置:public static async Task Main(string[] args) { using var host = Host.CreateApplicationBuilder(args).Build(); var config = host.Services.GetRequiredService<IConfiguration>(); var settings = new Settings(); config.GetSection("Settings").Bind(settings); var siteDetails = config.GetSection("Sites").Get<List<SiteDetail>>(); // 后续业务代码 }
修正后完整示例
appsettings.json(保持原结构不变)
{ "Settings":{ "Name": "test123", "IsValid": true, "Counter": 123 }, "Sites": [ { "site": "US", "dateFormat": "MM/dd/yyyy", "timeFormat": "HH:mm:ss" }, { "site": "IE", "dateFormat": "dd/MM/yyyy", "timeFormat": "HH:mm:ss" } ] }
SiteDetail.cs
public class SiteDetail { public string site { get; set; } public string dateFormat { get; set; } public string timeFormat { get; set; } }
Settings.cs
public class Settings { public string Name { get; set; } public bool IsValid { get; set; } public int Counter { get; set; } }
Main方法
public static async Task Main(string[] args) { using var host = Host.CreateApplicationBuilder(args).Build(); var config = host.Services.GetRequiredService<IConfiguration>(); var settings = new Settings(); config.GetSection("Settings").Bind(settings); // 方式1:Bind绑定 var siteDetails = new List<SiteDetail>(); config.GetSection("Sites").Bind(siteDetails); // 方式2:Get<T>直接获取(更简洁) // var siteDetails = config.GetSection("Sites").Get<List<SiteDetail>>(); // 验证输出 foreach (var site in siteDetails) { Console.WriteLine($"Site: {site.site}, DateFormat: {site.dateFormat}"); } }
内容的提问来源于stack exchange,提问作者Seany84
相关产品推荐
相关产品推荐

