You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6中从appsettings.json读取字符串数组返回Null问题

问题分析与解决方法

你的代码存在三处关键错误,导致读取配置时返回null:

  1. 配置绑定的Section不匹配
    你在ConfigureServices中用_configuration.GetSection("ColourCodes")绑定Colours类,但这个Section对应的是一个字符串数组,而Colours类需要的是包含ColourCodes数组属性的对象,结构完全不匹配。

  2. 模型与配置结构不兼容
    Colours类定义了ColourCodes属性,但你的appsettings中ColourCodes直接是顶层数组,并非嵌套在Colours对象下,导致绑定无法映射。

  3. 控制器注入类型错误
    你注入了IOptions<List<Colours>>,但实际配置的是单个Colours实例(或数组),而非Colours对象的列表,类型不匹配导致无法正确获取值。


正确解决方法(两种可选)

方法一:直接绑定字符串数组(无需包装类)

这种方式适合不需要额外包装类的场景,直接读取顶层数组:

  1. 修改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;
            });
}
  1. 修改控制器的注入与使用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:22:15