.NET Core 6中从appsettings.json读取字符串数组返回Null问题
问题分析与解决方法
你的代码存在三处关键错误,导致读取配置时返回null:
配置绑定的Section不匹配
你在ConfigureServices中用_configuration.GetSection("ColourCodes")绑定Colours类,但这个Section对应的是一个字符串数组,而Colours类需要的是包含ColourCodes数组属性的对象,结构完全不匹配。模型与配置结构不兼容
Colours类定义了ColourCodes属性,但你的appsettings中ColourCodes直接是顶层数组,并非嵌套在Colours对象下,导致绑定无法映射。控制器注入类型错误
你注入了IOptions<List<Colours>>,但实际配置的是单个Colours实例(或数组),而非Colours对象的列表,类型不匹配导致无法正确获取值。
正确解决方法(两种可选)
方法一:直接绑定字符串数组(无需包装类)
这种方式适合不需要额外包装类的场景,直接读取顶层数组:
- 修改
Startup.cs的配置代码:
public void ConfigureServices(IServiceCollection services) { // 直接绑定ColourCodes数组到List<string> services.Configure<List<string>>(_configuration.GetSection("ColourCodes")); services.AddControllers() .AddJsonOptions(jsonOptions => { jsonOptions.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; }); }
- 修改控制器的注入与使用:
private readonly IOptions<List<string>> _colourCodes; public ColorController(IOptions<List<string>> colourCodes) { _colourCodes = colourCodes; } // 示例使用 [HttpGet] public IActionResult GetColours() { var codes = _colourCodes.Value; // 此时codes会包含["re", "bl", "gr"] return Ok(codes); }
方法二:使用包装类(调整配置或绑定逻辑)
如果需要保留Colours包装类,有两种子方案:
子方案A:调整appsettings结构匹配模型
修改appsettings.json,将数组嵌套到Colours对象下:
{ "Colours": { "ColourCodes": [ "re", "bl", "gr" ] } }
然后修改Startup.cs的配置:
public void ConfigureServices(IServiceCollection services) { services.Configure<Colours>(_configuration.GetSection("Colours")); services.AddControllers() .AddJsonOptions(jsonOptions => { jsonOptions.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; }); }
控制器注入调整为:
private readonly IOptions<Colours> _colours; public ColorController(IOptions<Colours> colours) { _colours = colours; } // 示例使用 [HttpGet] public IActionResult GetColours() { var codes = _colours.Value.ColourCodes; // 获取数组 return Ok(codes); }
子方案B:保持现有appsettings,修改模型
如果不想改动appsettings,可以修改模型为直接接收数组(本质和方法一类似):
// 移除原Colours类,直接用List<string>或string[],后续配置和控制器注入同方法一
内容的提问来源于stack exchange,提问作者amd
相关产品推荐
相关产品推荐

