ASP.NET Core Dapatkan Json Array menggunakan IConfiguration


168

Di appsettings.json

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

Di Startup.cs

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

Di HomeController

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

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

Ada kode saya di atas, saya mendapat null. Bagaimana cara mendapatkan array?

Jawaban:


103

Jika Anda ingin memilih nilai item pertama maka Anda harus melakukan seperti ini-

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

Jika Anda ingin memilih nilai seluruh array maka Anda harus melakukan seperti ini-

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

Idealnya, Anda harus mempertimbangkan untuk menggunakan pola opsi yang disarankan oleh dokumentasi resmi. Ini akan memberi Anda lebih banyak manfaat.


23
Jika Anda memiliki array objek seperti "Clients": [ {..}, {..} ], Anda harus memohon Configuration.GetSection("Clients").GetChildren().
halllo

40
Jika Anda memiliki array literal seperti "Clients": [ "", "", "" ], Anda harus memohon .GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray().
halllo

6
Jawaban ini sebenarnya akan menghasilkan 4 item, yang pertama adalah bagian itu sendiri dengan nilai kosong. Itu tidak benar.
Giovanni Bassi

4
Saya berhasil var clients = Configuration.GetSection("Clients").GetChildren() .Select(clientConfig => new Client { ClientId = clientConfig["ClientId"], ClientName = clientConfig["ClientName"], ... }) .ToArray();
memohonnya

1
Tak satu pun dari opsi ini bekerja untuk saya karena objek kembali nol pada titik "Klien" menggunakan contoh hallo. Saya yakin json terbentuk dengan baik karena bekerja dengan offset yang dimasukkan dalam string ["item: 0: childItem"] dalam format "Item": [{...}, {...}]
Clarence

283

Anda dapat menginstal dua paket NuGet berikut:

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

Dan Anda akan memiliki kemungkinan untuk menggunakan metode ekstensi berikut:

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

13
Ini jauh lebih mudah daripada jawaban lainnya.
jao

14
Ini adalah jawaban terbaik sejauh ini.
Giovanni Bassi

15
Dalam kasus saya, aplikasi web Aspnet core 2.1, termasuk dua paket nuget ini. SO itu hanya satu perubahan baris. Terima kasih
Shibu Thannikkunnath

Yang paling sederhana!
Pablo

3
Ini juga bekerja dengan berbagai objek, misalnya _config.GetSection("AppUser").Get<AppUser[]>();
Giorgos Betsos

60

Tambahkan level di appsettings.json Anda:

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

Buat kelas yang mewakili bagian Anda:

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

Di kelas startup aplikasi Anda, ikat model Anda dan masukkan dalam layanan DI:

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

Dan di controller Anda, dapatkan data konfigurasi Anda dari layanan 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);
    }
}

Anda juga dapat menyimpan seluruh model konfigurasi di properti di controller Anda, jika Anda membutuhkan semua data:

public class HomeController : Controller
{
    private readonly MySettings _mySettings;

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

    public IActionResult Index()
    {
        return Json(_mySettings.MyArray);
    }
}

Layanan injeksi ketergantungan ASP.NET Core bekerja seperti pesona :)


Jadi, bagaimana Anda menggunakan MySettingsStartup?
T.Coutlakis

Saya mendapatkan kesalahan yang membutuhkan koma antara "MySettings" dan "MyArray".
Markus

35

Jika Anda memiliki array objek JSON kompleks seperti ini:

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

Anda dapat mengambil pengaturan dengan cara ini:

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

Ini berfungsi agar saya mengembalikan array string dari konfigurasi saya:

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

Bagian konfigurasi saya terlihat seperti ini:

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

15

Untuk kasus mengembalikan array objek JSON kompleks dari konfigurasi, saya telah mengadaptasi jawaban @ djangojazz untuk menggunakan tipe anonim dan dinamis daripada tupel.

Diberikan bagian pengaturan:

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

Anda dapat mengembalikan array objek dengan cara ini:

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

Ini luar biasa
Vladimir Demirev

11

Agak pertanyaan lama, tapi saya bisa memberikan jawaban yang diperbarui untuk .NET Core 2.1 dengan standar C # 7. Katakanlah saya memiliki daftar hanya di appsettings.Development.json seperti:

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

Saya dapat mengekstraknya di mana saja bahwa Microsoft.Extensions.Configuration.IConfiguration diimplementasikan dan dihubungkan seperti ini:

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

Sekarang saya memiliki daftar objek yang diketik dengan baik yang diketik dengan baik. Jika saya menggunakan testUsers.First (), Visual Studio sekarang akan menampilkan opsi untuk 'UserName', 'Email', dan 'Password'.


9

Dalam ASP.NET Core 2.2 dan yang lebih baru kita dapat menyuntikkan IConfiguration di mana saja di aplikasi kita seperti dalam kasus Anda, Anda dapat menyuntikkan IConfiguration di HomeController dan gunakan seperti ini untuk mendapatkan array.

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

5

Anda bisa mendapatkan array langsung tanpa menambah level baru dalam konfigurasi:

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

4

Bentuk pendek:

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

Ini mengembalikan array string:

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


1
Bekerja untukku. Terima kasih. Menggunakan Microsoft.Extensions.Configuration.Binder juga berfungsi, namun saya ingin menjauh dari referensi paket Nuget lain jika satu baris kode dapat melakukan pekerjaan.
Sau001

3

Ini bekerja untuk saya; Buat beberapa file json:

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

Kemudian, tentukan beberapa kelas yang memetakan:

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

paket nuget:

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

Kemudian, muat:

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.