Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从ASP.NET5中的config.json正确读取嵌套配置值?_C#_Asp.net_Asp.net Core_Config.json - Fatal编程技术网

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

C# 如何从ASP.NET5中的config.json正确读取嵌套配置值?,c#,asp.net,asp.net-core,config.json,C#,Asp.net,Asp.net Core,Config.json,我遵循了一些规则,但我在如何正确读取“嵌套”配置值(如果这是正确的术语)方面遇到了困难 下面是config.json的相关部分: { "ApplicationName" : "OwNextApp", "AppSettings": { "SiteTitle": "OwNext" }, } 以及HomeController.cs的相关部分: public IActionResult About() { var appNestedNameFailed

我遵循了一些规则,但我在如何正确读取“嵌套”配置值(如果这是正确的术语)方面遇到了困难

下面是
config.json
的相关部分:

{
    "ApplicationName" : "OwNextApp",
    "AppSettings": {
        "SiteTitle": "OwNext"
    },
}
以及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();
}
appNestedNameFailed
的值为空(我在研究之前的首次尝试)。并且
appNestedNameSuccess
具有值;在我进行研究并在测试中发现(显示的相关代码):

有人能解释为什么会这样吗?为什么在
上使用
更有意义?从我与JSON数据的交互来看,通常
表示法工作得很好,例如


同样,我也发现了类似的情况,但这并不能解释为什么选择了

深入观察源代码的内部,并指责进入/退出方法查看:

private void VisitJObject(JObject jObject)
{
    foreach (var property in jObject.Properties())
    {
        EnterContext(property.Name);
        VisitProperty(property);
        ExitContext();
    }
}

private void EnterContext(string context)
{
    _context.Push(context);
    _currentPath = string.Join(":", _context.Reverse());
}

private void ExitContext()
{
    _context.Pop();
    _currentPath = string.Join(":", _context.Reverse());
}
似乎ASP.NET团队应该留下更具启发性的签入注释:)

我最好的猜测是,config.json文件中可能存储了需要
的数据,而
则不太常见。例如:

"AppSettings": {
    "Site.Title": "Is .NET getting faster?"
},
这是一个糟糕的例子,但他们希望尽可能地“安全”,并使用超出规范的东西似乎是合理的。如果您想存储一个类型的全名,这也会稍微容易一些,而不需要担心一个错误的周期

"AppSettings": {
    "ImportantTypeName": "WebApp.CoolStuff.Helpers.AwesomeClass"
},

这是我们第一次创建配置模型时确定的约定。我们从json开始,这里的分隔符是


无论如何,如果您不想担心这些约定,我建议使用将配置绑定到模型(强类型对象)的。这可以作为一个例子。

这似乎是合理的,也是我的想法。但是,我希望有更具启发性的东西。感谢您对此进行研究。更多地了解这个config.json,我认为他们选择了
,因为它用于嵌套数据,例如
“AppSettings”:{
。无论如何。在json中用
嵌套对象是很典型的,因为它表示一个键/值对。因此,它可能最终成为最自然的分隔符。很抱歉,我无法为您找到更正式的答案:)。因此,我怀疑它只是自然分隔符。感谢您确认:)谢谢。我喜欢强类型因此,我使用了
ConfigurationBinder
。仅供参考,链接已失效谢谢@RSid。我修复了链接再次失效的问题:(我不确定第一个代码部分底部的ConnectionString 2的“GetSection”是否应该在其中出现两次。
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;  
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;  
{
  "ConnectionStrings": {
    "DefaultConnection": "myconnection"
  },
}