Как извлечь список из appsettings.json в .net core

У меня есть файл appsettings.json, который выглядит следующим образом:

{
    "someSetting": {
        "subSettings": [
            "one",
            "two",
            "three"
         ]
    }
}

Когда я создаю свой корень конфигурации и делаю что-то вроде config["someSetting:subSettings"], он возвращает null, и доступные доступные настройки имеют следующий вид:

config["someSettings:subSettings:0"]

Есть ли лучший способ получить содержимое someSettings:subSettings в качестве списка?

Ответ 1

Вы можете использовать связыватель конфигурации, чтобы получить строгое представление типа источников конфигурации.

Это пример из теста, который я написал ранее, надеюсь, он поможет:

    [Fact]
    public void BindList()
    {
        var input = new Dictionary<string, string>
        {
            {"StringList:0", "val0"},
            {"StringList:1", "val1"},
            {"StringList:2", "val2"},
            {"StringList:x", "valx"}
        };

        var configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddInMemoryCollection(input);
        var config = configurationBuilder.Build();

        var list = new List<string>();
        config.GetSection("StringList").Bind(list);

        Assert.Equal(4, list.Count);

        Assert.Equal("val0", list[0]);
        Assert.Equal("val1", list[1]);
        Assert.Equal("val2", list[2]);
        Assert.Equal("valx", list[3]);
    }

Важной частью является призыв к Bind.

Тест и другие примеры на GitHub

Ответ 2

Предполагая, что ваш appsettings.json выглядит следующим образом:

{
  "foo": {
    "bar": [
      "1",
      "2",
      "3"
    ]
  }
}

Вы можете извлечь элементы списка так:

Configuration.GetSection("foo:bar").Get<List<string>>()

Ответ 3

В .NetCore это то, что я сделал:

В вашем appsettings.json создайте раздел конфигурации для ваших пользовательских определений:

"Definitions": {
  "Defined": [
    {
      "Name": "somename",
      "Title": "sometitle",
      "Image": "some image url"
    },
    {
      "Name": "anothername",
      "Title": "anothertitle",
      "Image": "another image url"
    }
  ]
}

Создайте класс для моделирования объектов:

public class Defined
{
    public string Name { get; set; }
    public string Title { get; set; }
    public string Image { get; set; }
}

в вашем автозагрузке → ConfigureServices

services.Configure<List<Defined>>(Configuration.GetSection("Definitions:Defined"));

Тогда в вашем контроллере что-то вроде этого:

Public class AccountController: Controller
{
    private readonly IOptions<List<Defined>> _customClients;
    public AccountController(IOptions<List<Defined>> customClients)
    {
        _customClient = customClients;
    }
  ...
}

просто в качестве примера я использовал его в другом месте в приведенном выше контроллере, как это:

       _customClients.Value.ForEach(x => {
            // do something with x
        });

Ответ 4

var settingsSection = config.GetSection["someSettings:subSettings"];
var subSettings = new List<string>;

foreach (var section in settingsSection.GetChildren())
{
    subSettings.Add(section.Value);
}

Это должно дать вам необходимые значения, хранящиеся в subSettings

Извиняюсь за воспитание полу-старой темы. Мне было трудно найти ответ, так как многие методы устарели, как Get и GetValue. Это должно быть хорошо, если вам нужно только простое решение без привязки конфигурации. :)

Ответ 5

Я создал это недавно, чтобы я мог читать Cors Domains из конфигурации и, таким образом, использовать наш CI/CD-сервер для подстановки переменных в моем списке имен Cors Domain.. Теперь я могу добавить политику CORS, как это..

 services.AddCors(options =>
        {
            options.AddPolicy(CorsPolicyName,
                builder => builder.WithOrigins(GetAllowedOrigins())
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
        });

Код ниже должен быть адаптирован к тому, что вы пытаетесь сделать

    private string[] GetAllowedOrigins()
    {
        var domainArray = _configuration.GetSection("CorsDomains").AsEnumerable();
        var domains = domainArray as KeyValuePair<string, string>[] ?? domainArray.ToArray();

        return domains
            .Where(d => !string.IsNullOrEmpty(d.Value))
            .Select(d => d.Value.ToLower())
            .Distinct()
            .ToArray();
    }

прочитает файл appsettings.json, который содержит что-то подобное, и выведет строковый массив, в данном случае, списка доменов.

"CorsDomains": [
"http://localhost:4200",
"http://localhost:1800"

]