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"
},
}