配置GetSection返回对象部分的空值

时间:2018-12-20 16:01:57

标签: c# asp.net-core

您好,我在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里面偷看,所有的内容都如图片所示:

enter image description here

为什么对于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

3 个答案:

答案 0 :(得分:3)

您的示例没有错。您所指的Value属性是string,对于nullsect变量来说,它都是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}}。 ProductionKey位于该层次结构的最低级别。

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)

答案(TanvirArjelKirk 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