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.