【问题标题】:How can I use GetSection method by getting values and keys from appsettings.json' array parts?如何通过从 appsettings.json 的数组部分获取值和键来使用 GetSection 方法?
【发布时间】:2017-11-01 12:46:01
【问题描述】:

如何使用Microsoft.Extensions.Configuration 获取appsettings.json 数据?我的 JSON 在下面,但这段代码不起作用。一般来说,我的愿望是得到一个数组或列表。但我做不到。

var someArray = configuration.GetSection("Test").GetChildren().Select(x => x).ToArray();
"Test": [
  {
    "A": "101",
    "B": "6390"
  },
  {
    "A": "101",
    "B": "6391"
  },
  {
    "A": "101",
    "B": "6392"
  }
]

【问题讨论】:

    标签: c# .net json asp.net-core


    【解决方案1】:

    您可以简单地调用IConfiguration.AsEnumerable 将其转换为IEnumerable<KeyValuePair<string,string>>,然后您可以循环。请注意,key 是配置路径,因此对于您的示例,您会看到像 Test:0:ATest:2:B 这样的键。

    foreach (var kv in Configuration.GetSection("Test").AsEnumerable())
    {
        Console.WriteLine("{0}: {1}", kv.Key, kv.Value);
    }
    

    如果您在配置部分中,您还可以使用AsEnumerable(makePathsRelative: true) 来展平键并删除该部分的前缀。

    【讨论】:

    • 谢谢 - 这很有帮助。然而......对于像{"parent": {"a": {children of a}, "b": {children of b}}} 这样的JSON 对象,它也在迭代a/b 的孩子。我该如何防止呢?
    • 配置通常没有直接的层次结构,因此枚举它会为您提供该部分中的所有配置项。如果你只想要直接的孩子,你可以改用IConfiguration.GetChildren()
    • 我编辑了你的答案以显示我想要的解决方案。如果这不合适,我会发布另一个答案
    • @ZachSmith 这将是一个不同问题的解决方案。使用GetChildren() 获得单个 层次结构级别并没有什么特别之处(您不需要将其设为AsEnumerable,因为它已经是一个集合)。这个问题是关于检索更深层次结构的值。
    【解决方案2】:

    您应该将其直接投射到您的模型中。

    services.Configure<AssetProviderConfig>(Configuration.GetSection("AssetProvider"));
    

    然后你可以链接到你的对象。

    我认为您可以直接执行此操作,但不能 100% 确定。

    var config = Configuration.GetSection("AssetProvider").Get<AssetProviderC‌​onfig>();
    

    试一试!

    【讨论】:

    • 应该是var config = Configuration.GetSection("AssetProvider").Get&lt;AssetProviderConfig&gt;();
    • GetSection 返回一个 IConfiguration,您不能将其转换为其他类型。您必须使用配置绑定器绑定它。
    • @ChrisPratt 和戳,我害怕我错了 ;) 只是在我的脑海中 eh.. thnx 的更新!我编辑答案!
    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 2015-09-27
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多