ASP.NET Core IConfiguration kullanarak Json Dizisi alın


168

Appsettings.json içinde

{
      "MyArray": [
          "str1",
          "str2",
          "str3"
      ]
}

Startup.cs içinde

public void ConfigureServices(IServiceCollection services)
{
     services.AddSingleton<IConfiguration>(Configuration);
}

HomeController'da

public class HomeController : Controller
{
    private readonly IConfiguration _config;
    public HomeController(IConfiguration config)
    {
        this._config = config;
    }

    public IActionResult Index()
    {
        return Json(_config.GetSection("MyArray"));
    }
}

Yukarıdaki kodlarım var, ben null var dizi nasıl alınır?

Yanıtlar:


104

İlk öğenin değerini seçmek istiyorsanız, bunu yapmalısınız.

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

Tüm dizinin değerini seçmek istiyorsanız, bunu yapmalısınız.

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

İdeal olarak, resmi belgelerde önerilen seçenek desenini kullanmayı düşünmelisiniz . Bu size daha fazla fayda sağlayacaktır.


24
Gibi bir dizi nesneniz "Clients": [ {..}, {..} ]varsa, çağırmanız gerekir Configuration.GetSection("Clients").GetChildren().
halllo

41
Gibi bir değişmez diziniz "Clients": [ "", "", "" ]varsa, çağırmanız gerekir .GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray().
halllo

6
Bu cevap aslında 4 madde üretecek, ilki bölümün kendisi boş bir değere sahip olacak. Yanlış.
Giovanni Bassi

4
Başarıyla şöyle çağırıyorum:var clients = Configuration.GetSection("Clients").GetChildren() .Select(clientConfig => new Client { ClientId = clientConfig["ClientId"], ClientName = clientConfig["ClientName"], ... }) .ToArray();
halllo

1
Nesne "İstemciler" noktasında hallo'nun örneğini kullanarak geri döneceğinden, bu seçeneklerin hiçbiri benim için çalışmaz. Ben json iyi biçimlendirilmiş "Madde:" [: item: 0: childItem "] dizesine eklenen ofset ile çalışır gibi eminim: [{...}, {...}]
Clarence

285

Aşağıdaki iki NuGet paketini yükleyebilirsiniz:

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

Ve sonra aşağıdaki uzantı yöntemini kullanma olanağına sahip olacaksınız:

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

13
Bu, diğer cevaplardan çok daha basittir.
jao

14
Bu en iyi cevap.
Giovanni Bassi

15
Benim durumumda, Aspnet core 2.1 web uygulaması, bu iki nuget paketini içeriyordu. Yani onun sadece bir satır değişiklik oldu. Teşekkürler
Shibu Thannikkunnath

En basit olanı!
Pablo

3
Ayrıca bir dizi nesne ile de çalışır, örneğin _config.GetSection("AppUser").Get<AppUser[]>();
Giorgos Betsos

60

Appsettings.json'a bir seviye ekleyin:

{
  "MySettings": {
    "MyArray": [
      "str1",
      "str2",
      "str3"
    ]
  }
}

Bölümünüzü temsil eden bir sınıf oluşturun:

public class MySettings
{
     public List<string> MyArray {get; set;}
}

Uygulama başlangıç ​​sınıfınızda, modelinizi DI hizmetine enjekte edin:

services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));

Denetleyicinizde yapılandırma verilerinizi DI hizmetinden alın:

public class HomeController : Controller
{
    private readonly List<string> _myArray;

    public HomeController(IOptions<MySettings> mySettings)
    {
        _myArray = mySettings.Value.MyArray;
    }

    public IActionResult Index()
    {
        return Json(_myArray);
    }
}

Tüm verilere ihtiyacınız varsa, yapılandırma modelinizin tamamını denetleyicinizdeki bir özellikte de saklayabilirsiniz:

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'un bağımlılık enjeksiyon hizmeti tıpkı bir cazibe gibi çalışır :)


Peki MySettingsBaşlangıçta nasıl kullanılır ?
T.Coutlakis

"MySettings" ile "MyArray" arasında virgül kullanması gerektiğini belirten bir hata mesajı alıyorum.
Markus

35

Bunun gibi karmaşık JSON nesneleri diziniz varsa:

{
  "MySettings": {
    "MyValues": [
      { "Key": "Key1", "Value":  "Value1" },
      { "Key": "Key2", "Value":  "Value2" }
    ]
  }
}

Ayarları şu şekilde alabilirsiniz:

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

Bu benim yapılandırma dizeleri bir dizi dönmek için benim için çalıştı:

var allowedMethods = Configuration.GetSection("AppSettings:CORS-Settings:Allow-Methods")
    .Get<string[]>();

Yapılandırma bölümüm şöyle:

"AppSettings": {
    "CORS-Settings": {
        "Allow-Origins": [ "http://localhost:8000" ],
        "Allow-Methods": [ "OPTIONS","GET","HEAD","POST","PUT","DELETE" ]
    }
}

15

Bir dizi karmaşık JSON nesnesini yapılandırmadan döndürme durumunda, @ djangojazz'ın cevabını , tuples yerine anonim türleri ve dinamik kullanacak şekilde uyarladım .

Aşağıdakilerin ayarlar bölümü verildi:

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

Nesne dizisini şu şekilde döndürebilirsiniz:

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

Bu harika
Vladimir Demirev

11

Eski bir soru, ama C # 7 standartlarına sahip .NET Core 2.1 için güncellenmiş bir cevap verebilirim. Diyelim ki sadece appsettings.Development.json'da bir girişim var:

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

Onları Microsoft.Extensions.Configuration.IConfiguration uygulandığı ve bu şekilde bağlandığı her yerde ayıklayabilirsiniz:

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)>();

Şimdi iyi yazılmış iyi yazılmış bir nesnenin bir listesi var. TestUsers.First () yöntemine gidersem, Visual Studio artık 'KullanıcıAdı', 'E-posta' ve 'Parola' seçeneklerini göstermelidir.


9

ASP.NET Core 2.2 ve sonraki sürümlerinde, uygulamanızın herhangi bir yerine sizin durumunuzda olduğu gibi IConfiguration'ı enjekte edebiliriz, HomeController'da IConfiguration'ı enjekte edebilir ve diziyi almak için böyle kullanabilirsiniz.

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

5

Diziyi, yapılandırmada yeni bir seviyeye yükseltmeden doğrudan alabilirsiniz:

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

4

Kısa form:

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

Bir dize dizisi döndürür:

{ "Dizge1", "str2", "str3"}


1
Benim için çalıştı. Teşekkürler. Microsoft.Extensions.Configuration.Binder kullanarak da çalışır, ancak tek bir kod satırı iş yapabiliyorsa başka bir Nuget paketine başvurmaktan uzak kalmak istiyorum.
Sau001

3

Bu benim için çalıştı; Bazı json dosyaları oluşturun:

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

Ardından, eşleşen bir sınıf tanımlayın:

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

nuget paketleri:

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

Ardından yükleyin:

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.