您好,我在json
中使用了.NET Core App
配置文件,但我不明白为什么对于作为对象的子节却得到null值:
{
"tt": {
"aa":3,
"x":4
},
"Url":333,
"Config": {
"Production": {
"RedisAddress": {
"Hostname": "redis0",
"Port": 6379
},
"OwnAddress": {
"Hostname": "0.0.0.0",
"Port": 9300
}
},
"Dev": {
"RedisAddress": {
"Hostname": "redis0",
"Port": 6379
},
"OwnAddress": {
"Hostname": "0.0.0.0",
"Port": 9300
},
"Logger": "logger.txt"
}
}
}
当我尝试GetSection("Config")
或GetSection("tt")
时,我得到的值是null
。但是它返回原始类型的值,例如我的情况Url
。
有趣的是,如果我在configuration.Providers[0].Data
里面偷看,所有的内容都如图片所示:
为什么对于object
类型它返回null?
代码
WebHostBuilder builder = new WebHostBuilder();
builder.UseStartup<Startup>();
string appPath = AppDomain.CurrentDomain.BaseDirectory;
string jsonPath = Path.Combine(Directory.GetParent(Directory.GetParent(appPath).FullName).FullName, "appsettings.json");
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(appPath)
.AddJsonFile(jsonPath, optional: true, reloadOnChange: true)
.Build();
var sect = configuration.GetSection("Config");//has value null
var sect2 = configuration.GetSection("tt");//has value null
var sect3 = configuration.GetSection("Url"); has value 333
答案 0 :(得分:3)
您的示例没有错。您所指的Value
属性是string
,对于null
和sect
变量来说,它都是sect2
,这仅仅是因为它们都不包含{ {1}}的价值-正如您所说,它们都是对象。
如果您想从中提取一个值string
,您可以使用以下方法:
sect2
还有更多其他选项可用于获取像这样的部分的值。这是将绑定到POCO的另一个示例:
var aaValue = sect2.GetValue<int>("aa");
如果您只想获得一个嵌套值,那么实际上根本没有理由使用public class TT
{
public int AA { get; set; }
public int X { get; set; }
}
var ttSection = sect2.Get<TT>();
。例如,您可以执行以下操作:
GetSection
答案 1 :(得分:1)
var sect = configuration.GetSection("Config");
返回null,因为Config
节没有键和值,而是有一个SubSection
的{{1}}。 Production
和Key
位于该层次结构的最低级别。
Here是Microsoft从ASP.NET Core中读取Value
文件的详细信息。
根据上述文档,您需要执行以下操作以从appsettings.json
文件中读取值:
appsettings.json
按照上述方法,您可以从var hostName = configuration.GetSection("Config:Production:RedisAddress:Hostname").Value; // will return the value "redis0" for key `HostName`
var port = configuration.GetSection("Config:Production:RedisAddress:Port").Value; // will return the value 6379 for key `Port`
var aa = configuration.GetSection("tt:aa").Value; // will return 3
文件中读取任何值:
答案 2 :(得分:1)
答案(TanvirArjel和Kirk Larkin)都是正确的。 我将为您澄清一些事情,并提供另一种从配置文件获取价值的方法。
要从 string xml = @"<root>
<person>
<name>Alan</name>
<rollno>123</rollno>
</person>
</root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string json = JsonConvert.SerializeXmlNode(doc);
获取值,您需要将值({
"root": {
"person": {
"name": "Alan",
"rollno": "123"
}
}
}
)的路径传递到{
"root": {
"person": {
"name": "Alan",
"rollno": 123 <<<<<< to be number and not string<<<<<<
}
}
}
。
有多种方法可以在不将节绑定到类的情况下获取值。例如:
appsettings.json