如何从ASP.NET5中的config.json正确读取嵌套配置值?

Crn*_*ena 8 c# asp.net config.json asp.net-core

我正在关注ASP.NET 5的一些示例,我偶然发现了如何正确读取"嵌套"配置值(如果这是正确的术语).

以下是相关部分config.json:

{
    "ApplicationName" : "OwNextApp",
    "AppSettings": {
        "SiteTitle": "OwNext"
    },
}
Run Code Online (Sandbox Code Playgroud)

相关部分HomeController.cs:

public IActionResult About()
{
    var appNestedNameFailed = _config.Get("AppSettings.SiteTitle");
    var appNestedNameSuccess = _config.Get("AppSettings:SiteTitle");
    var appName = _config.Get("ApplicationName");
    ViewBag.Message = string.Format(@"Your 
        APP NAME: {0};
        APP NESTED NAME FAILED: {1}; 
        APP NESTED NAME SUCCESS: {2}", 
            appName, appNestedNameFailed, appNestedNameSuccess);

    return View();
}
Run Code Online (Sandbox Code Playgroud)

对于值appNestedNameFailed是空的(研究之前我最初的尝试).并且appNestedNameSuccess有价值; 在我进行研究并在配置测试中找到(相关代码显示):

// Assert
Assert.Equal("IniValue1", config.Get("IniKey1"));
Assert.Equal("IniValue2", config.Get("IniKey2:IniKey3"));
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样吗?为什么使用:结束有意义.?从我与JSON数据的交互,通常.符号工作正常,例如如何访问嵌套的json数据.

此外,我发现了类似的问题,但这并没有解释为什么:被选中.

Vic*_*aci 9

这是我们在第一次创建配置模型时决定的约定.我们开始考虑json并且:是那里的分隔符.

无论如何,如果您不想担心这些约定,我建议使用ConfigurationBinder配置绑定到模型(强类型对象).以下是可作为示例的测试.

  • 链接又死了:( (3认同)
  • 谢谢@RSid。我修复了链接 (2认同)
  • 我修复了链接(再次) (2认同)

Jah*_*han 7

using Microsoft.Extensions.Configuration;
using System.IO;

IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

var connectionString = configuration.GetValue<string>("ConnectionStrings:DefaultConnection");

// or

var connectionString2= configuration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;  
Run Code Online (Sandbox Code Playgroud)

appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "myconnection"
  },
}
Run Code Online (Sandbox Code Playgroud)