Как извлечь список из 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"
]