如何替换自定义appsettings.json文件中的列表项?

时间:2019-01-30 04:28:57

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

我为每种环境都有自定义的appsettings.json文件,因此有appsettings.Dev.json,appsettings.Test.json,appsettings.Prod.json。在主要的appsettings.json文件中,我有以下代码:

  "EmailSettings": {
    "Recipients": [
      "person@test.com"
    ]
  }

然后在自定义json文件中,我想覆盖此列表,如下所示:

  "EmailSettings": {
    "Recipients": [
      "anotherperson@test.com"
    ]
  }

但是,它却像这样附加:

  "EmailSettings": {
    "Recipients": [
      "person@test.com",
      "anotherperson@test.com"
    ]
  }

使用所有其他类型的设置,它们将被替换,但是由于某些原因,似乎自定义设置文件中的列表被附加了。使用.net,您过去使用xslt可以更精确地确定是否要替换或附加覆盖的设置。这里有什么建议吗?

解决方案(对我来说)

我这样做了,它被替换为自定义json设置。主要的appsettings.json:

  "EmailSettings": {
    "Recipients:0": "person@test.com"
  }

然后在自定义设置文件中:

  "EmailSettings": {
    "Recipients:0": "anotherperson@test.com"
  }

感谢您的回复!

2 个答案:

答案 0 :(得分:1)

我为环境使用了不同的 appsettings 文件(包括 Development

所以首先确保你已经在你的配置中添加了环境 json 文件:

config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{EnvironmentName}.json", optional: true, reloadOnChange: true)

然后在我原来的 appsettings.json 中它会是这样的:

"EmailSettings": {
    "Recipients": []
}

然后用于本地开发(Development 环境):appsettings.Development.json

"EmailSettings": {
    "Recipients": [
        "person@test.com"
    ]
}

然后对于其他环境(我们称之为 Staging):appsettings.Staging.json

"EmailSettings": {
    "Recipients": [
        "anotherperson@test.com"
    ]
}

然后,只需确保在其他环境中您已在环境变量中设置了 ASPNETCORE_ENVIRONMENT

答案 1 :(得分:0)

appsettings.Test.json中使用以下

"EmailSettings:Recipients:0" : "anotherperson@test.com"

Configuration API能够通过使用配置键中的定界符将分层数据展平来维护分层配置数据。

您将需要定义“电子邮件设置”类,例如

   public class EmailSettings
    {
        public List<string> Recipients { get; set; }
    }

并连接DI以在Configure类的Startup方法中添加选项

public void ConfigureServices(IServiceCollection services)
        {
            // add Options
            services.AddOptions();
            services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }