ASP.NET Core Отримайте масив Json за допомогою IConfiguration


168

В 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 Як отримати масив?

Відповіді:


103

Якщо ви хочете вибрати значення першого елемента, тоді вам слід зробити це,

var item0 = _config.GetSection("MyArray:0");

Якщо ви хочете вибрати значення всього масиву, тоді вам слід зробити так -

IConfigurationSection myArraySection = _config.GetSection("MyArray");
var itemArray = myArraySection.AsEnumerable();

В ідеалі слід розглянути можливість використання параметрів, запропонованих офіційною документацією. Це дасть вам більше переваг.


23
Якщо у вас є масив таких об’єктів "Clients": [ {..}, {..} ], вам слід викликати Configuration.GetSection("Clients").GetChildren().
зал

40
Якщо у вас є масив літералів на кшталт "Clients": [ "", "", "" ], вам слід викликати .GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray().
зал

6
Ця відповідь фактично створить 4 пункти, першим є сам розділ із порожнім значенням. Це неправильно.
Джованні Бассі

4
Я успішно var clients = Configuration.GetSection("Clients").GetChildren() .Select(clientConfig => new Client { ClientId = clientConfig["ClientId"], ClientName = clientConfig["ClientName"], ... }) .ToArray();
посилаюсь на

1
Жоден із цих параметрів не працює для мене, оскільки об’єкт повертається нульовим в точці "Клієнти", використовуючи приклад hallo. Я впевнений, що json добре сформований, оскільки він працює зі зміщенням, вставленим у рядок ["item: 0: childItem"] у форматі "Item": [{...}, {...}]
Clarence

283

Ви можете встановити наступні два пакети NuGet:

Microsoft.Extensions.Configuration    
Microsoft.Extensions.Configuration.Binder

І тоді ви будете мати можливість використовувати наступний метод розширення:

var myArray = _config.GetSection("MyArray").Get<string[]>();

13
Це набагато простіше, ніж інші відповіді.
джао

14
Це найкраща відповідь на сьогоднішній день.
Джованні Бассі

15
У моєму випадку веб-додаток Aspnet core 2.1 включив ці два цілі пакети. Так що це була лише одна зміна рядка. Спасибі
Shibu Thannikkunnath

Найпростіший!
Пабло

3
Він також працює з масивом об'єктів, наприклад _config.GetSection("AppUser").Get<AppUser[]>();
Giorgos Betsos,

60

Додайте рівень у своєму 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 працює так само, як і принадність :)


Тож як ви користуєтеся MySettingsв запуску?
Т.Кутлакіс

Я отримую помилку, що йому потрібна кома між "MySettings" та "MyArray".
Маркус

35

Якщо у вас є масив складних об'єктів 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");
}

30

Це працювало для мене, щоб повернути масив рядків з моєї конфігурації:

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" ]
    }
}

15

У випадку повернення масиву складних об'єктів JSON з конфігурації я адаптував відповідь @ djangojazz використовувати анонімні типи та динамічні, а не кортежі.

Дано розділ налаштувань:

"TestUsers": [
{
  "UserName": "TestUser",
  "Email": "Test@place.com",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "Test2@place.com",
  "Password": "P@ssw0rd!"
}],

Ви можете повернути об’єкт масиву таким чином:

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 };
}

Це приголомшливо
Володимир Демірев

11

Вигляд старого питання, але я можу дати відповідь оновлену для .NET Core 2.1 зі стандартами C # 7. Скажіть, у мене є список лише в appsettings.Development.json, таких як:

"TestUsers": [
  {
    "UserName": "TestUser",
    "Email": "Test@place.com",
    "Password": "P@ssw0rd!"
  },
  {
    "UserName": "TestUser2",
    "Email": "Test2@place.com",
    "Password": "P@ssw0rd!"
  }
]

Я можу витягнути їх будь-де, коли 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 тепер повинен відображати параметри "Ім'я користувача", "Електронна пошта" та "Пароль".


9

У ASP.NET Core 2.2 і пізніших версіях ми можемо ввести IConfiguration будь-де в нашому додатку, як у вашому випадку, ви можете ввести IConfiguration в HomeController і використовувати так, щоб отримати масив.

string[] array = _config.GetSection("MyArray").Get<string[]>();

5

Ви можете отримати масив прямий без збільшення нового рівня в конфігурації:

public void ConfigureServices(IServiceCollection services) {
    services.Configure<List<String>>(Configuration.GetSection("MyArray"));
    //...
}

4

Коротка форма:

var myArray= configuration.GetSection("MyArray")
                        .AsEnumerable()
                        .Where(p => p.Value != null)
                        .Select(p => p.Value)
                        .ToArray();

Він повертає масив рядків:

{"str1", "str2", "str3"}


1
Працювали для мене. Дякую. Використання Microsoft.Extensions.Configuration.Binder також працює, однак я б хотів ухилятися від посилання на інший пакет Nuget, якщо один рядок коду може виконати цю роботу.
Sau001

3

Це працювало для мене; Створіть кілька файлів json:

{
    "keyGroups": [
        {
            "Name": "group1",
            "keys": [
                "user3",
                "user4"
            ]
        },
        {
            "Name": "feature2And3",
            "keys": [
                "user3",
                "user4"
            ]
        },
        {
            "Name": "feature5Group",
            "keys": [
                "user5"
            ]
        }
    ]
}

Потім визначте клас, який відображає:

public class KeyGroup
{
    public string name { get; set; }
    public List<String> keys { get; set; }
}

nuget пакети:

Microsoft.Extentions.Configuration.Binder 3.1.3
Microsoft.Extentions.Configuration 3.1.3
Microsoft.Extentions.Configuration.json 3.1.3

Потім завантажте його:

using Microsoft.Extensions.Configuration;
using System.Linq;
using System.Collections.Generic;

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

configurationBuilder.AddJsonFile("keygroup.json", optional: true, reloadOnChange: true);

IConfigurationRoot config = configurationBuilder.Build();

var sectionKeyGroups = 
config.GetSection("keyGroups");
List<KeyGroup> keyGroups = 
sectionKeyGroups.Get<List<KeyGroup>>();

Dictionary<String, KeyGroup> dict = 
            keyGroups = keyGroups.ToDictionary(kg => kg.name, kg => kg);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.