如何使用appsettings.Development.json删除appsettings.json中的节点?

时间:2018-10-18 18:38:06

标签: asp.net-core .net-core asp.net-core-2.0

我正在为appsettings.Development.json覆盖{em> 或合并appsettings.json的方式而苦苦挣扎。我不确定如何通过使用appsettings.Development.json文件从appsettings.json中“清除”节点。

作为参考,我使用的是默认构建器,如此处https://github.com/aspnet/MetaPackages/blob/rel/2.0.0-preview1/src/Microsoft.AspNetCore/WebHost.cs#L159-L160

appsettings.json

{
  "Policy": {
    "roles": [
      {
        "name": "inventoryAdmin",
        "subjects": [ "bob", "alice" ],
        "identityRoles": [ "ActiveDirectory-Role-Manager" ]
      },
  ]
 }
}

给出该示例,为什么我不能在我的笔记本中做以下事情:

appsettings.Development.Json:

{ "Policy": { "Roles": [] } }

{ "Policy": { "Roles": null } }

当我通过Configuration.Get<PolicyServer.Local.Policy>().Roles之类的内容检查输出时,我仍然获得3个角色。

该问题有望指导我如何覆盖节点,而不仅仅是清除它。所以我希望从简单开始,并在那里努力。

1 个答案:

答案 0 :(得分:3)

IConfiguration实例中的所有设置都是简单的键值对。使用以下简化的示例JSON:

{
    "Roles": [
        { "Name": "Role1", "Subjects": [ "Alice", "Bob" ] },
        { "Name": "Role2", "Subjects": [ "Charlie" ] }
    ]
}

尽管这本质上是一个树形结构,但是当添加到您的IConfiguration实例中时,它会映射到以下键值对(此处还有一些其他空值,但它们不在本讨论的范围之内):

  • Roles =
  • Roles:0:Name = Role1
  • Roles:0:Subjects:0 = Alice
  • Roles:0:Subjects:1 = Bob
  • Roles:1:Name = Role2
  • Roles:1:Subjects:0 = Charlie

您可以看到,它模仿了JSON的层次结构,其中名称是对象属性,数字是数组的索引。第一个很重要:Roles的键没有任何值,因为值只能是简单的字符串,而它本身只是父项。

现在,当您向IConfiguration实例设置中添加一个额外的JSON文件时,它将映射到一组新的键/值对,这些键/值对将应用于现有的键/值对。采用以下其他JSON:

{
    "Roles": []
}

这只会覆盖现有的Roles密钥,并将其设置为已经具有的相同值: nothing 。如果您在JSON文件中使用null,则同样适用-这就是工作原理。

就这里的解决方案而言,我建议您看看是否可以重做appsettings.json方法。例如,您可能可以将角色配置本身放入例如appsettings.Production.json文件,并将默认版本留空,以使其在您的开发环境中不存在。换句话说,请尝试对不同的appsettings.json文件进行建模以使其自身具有可加性。