ASP.NET Core Получить массив Json с помощью IConfiguration
В appsettings.json
{
"MyArray": [
"str1",
"str2",
"str3"
]
}
В Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
}
В HomeController
public class HomeController : Controller
{
private readonly IConfiguration _config;
public HomeController(IConfiguration config)
{
this._config = config;
}
public IActionResult Index()
{
return Json(_config.GetSection("MyArray"));
}
}
Есть мои коды выше, я получил null
Как получить массив?
Ответы
Ответ 1
Если вы хотите выбрать стоимость первого предмета, вы должны сделать как this-
var item0 = _config.GetSection("MyArray:0");
Если вы хотите выбрать значение всего массива, вы должны сделать как this-
IConfigurationSection myArraySection = _config.GetSection("MyArray");
var itemArray = myArraySection.AsEnumerable();
В идеале, вы должны рассмотреть возможность использования шаблона опций, предложенного официальной документацией. Это даст вам больше преимуществ.
Ответ 2
Вы можете установить следующие два пакета NuGet:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Binder
И тогда у вас будет возможность использовать следующий метод расширения:
var myArray = _config.GetSection("MyArray").Get<string[]>();
Ответ 3
Добавьте уровень в ваш appsettings.json:
{
"MySettings": {
"MyArray": [
"str1",
"str2",
"str3"
]
}
}
Создайте класс, представляющий ваш раздел:
public class MySettings
{
public List<string> MyArray {get; set;}
}
В своем классе запуска приложения свяжите свою модель и вставьте ее в службу DI:
services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));
И в вашем контроллере получите ваши данные конфигурации из службы DI:
public class HomeController : Controller
{
private readonly List<string> _myArray;
public HomeController(IOptions<MySettings> mySettings)
{
_myArray = mySettings.Value.MyArray;
}
public IActionResult Index()
{
return Json(_myArray);
}
}
Вы также можете сохранить всю модель конфигурации в свойстве контроллера, если вам нужны все данные:
public class HomeController : Controller
{
private readonly MySettings _mySettings;
public HomeController(IOptions<MySettings> mySettings)
{
_mySettings = mySettings.Value;
}
public IActionResult Index()
{
return Json(_mySettings.MyArray);
}
}
Служба внедрения зависимостей ASP.NET Core работает просто как шарм :)
Ответ 4
Если у вас есть массив сложных объектов JSON, например:
{
"MySettings": {
"MyValues": [
{ "Key": "Key1", "Value": "Value1" },
{ "Key": "Key2", "Value": "Value2" }
]
}
}
Вы можете получить настройки таким образом:
var valuesSection = configuration.GetSection("MySettings:MyValues");
foreach (IConfigurationSection section in valuesSection.GetChildren())
{
var key = section.GetValue<string>("Key");
var value = section.GetValue<string>("Value");
}
Ответ 5
Это сработало для меня, чтобы вернуть массив строк из моей конфигурации:
var allowedMethods = Configuration.GetSection("AppSettings:CORS-Settings:Allow-Methods")
.Get<string[]>();
Мой раздел конфигурации выглядит так:
"AppSettings": {
"CORS-Settings": {
"Allow-Origins": [ "http://localhost:8000" ],
"Allow-Methods": [ "OPTIONS","GET","HEAD","POST","PUT","DELETE" ]
}
}
Ответ 6
Для случая возврата массива сложных объектов JSON из конфигурации я адаптировал ответ @djangojazz для использования анонимных типов и динамических, а не кортежей.
Учитывая раздел настроек:
"TestUsers": [
{
"UserName": "TestUser",
"Email": "[email protected]",
"Password": "[email protected]!"
},
{
"UserName": "TestUser2",
"Email": "[email protected]",
"Password": "[email protected]!"
}],
Вы можете вернуть массив объектов следующим образом:
public dynamic GetTestUsers()
{
var testUsers = Configuration.GetSection("TestUsers")
.GetChildren()
.ToList()
.Select(x => new {
UserName = x.GetValue<string>("UserName"),
Email = x.GetValue<string>("Email"),
Password = x.GetValue<string>("Password")
});
return new { Data = testUsers };
}
Ответ 7
Отчасти старый вопрос, но я могу дать обновленный ответ для .NET Core 2.1 со стандартами С# 7. Скажем, у меня есть список только в appsettings.Development.json, например:
"TestUsers": [
{
"UserName": "TestUser",
"Email": "[email protected]",
"Password": "[email protected]!"
},
{
"UserName": "TestUser2",
"Email": "[email protected]",
"Password": "[email protected]!"
}
],
Я могу извлечь их где угодно, чтобы Microsoft.Extensions.Configuration.IConfiguration реализована и подключена следующим образом:
var testUsers = Configuration.GetSection("TestUsers")
.GetChildren()
.ToList()
//Named tuple returns, new in C# 7
.Select(x =>
(
x.GetValue<string>("UserName"),
x.GetValue<string>("Email"),
x.GetValue<string>("Password")
)
)
.ToList<(string UserName, string Email, string Password)>();
Теперь у меня есть список хорошо напечатанных объектов, которые хорошо напечатаны. Если я захожу в testUsers.First(), Visual Studio теперь должна показывать параметры для "UserName", "Email" и "Password".
Ответ 8
Вы можете получить массив напрямую, не увеличивая новый уровень в конфигурации:
public void ConfigureServices(IServiceCollection services) {
services.Configure<List<String>>(Configuration.GetSection("MyArray"));
//...
}
Ответ 9
Краткая форма:
var myArray= configuration.GetSection("MyArray")
.AsEnumerable()
.Where(p => p.Value != null)
.Select(p => p.Value)
.ToArray();
Возвращает массив строк:
{ "Str1", "str2", "str3"}