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?

Maks
sumber

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.

Sanket
sumber
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[]>();
Razvan Dumitru
sumber
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 :)

AdrienTorris
sumber
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");
}
Dmitry Pavlov
sumber
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" ]
    }
}
Pencuri kode
sumber
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": "[email protected]",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "[email protected]",
  "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 };
}
jaycer
sumber
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": "[email protected]",
    "Password": "P@ssw0rd!"
  },
  {
    "UserName": "TestUser2",
    "Email": "[email protected]",
    "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'.

djangojazz
sumber
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[]>();
berpasir
sumber
5

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

public void ConfigureServices(IServiceCollection services) {
    services.Configure<List<String>>(Configuration.GetSection("MyArray"));
    //...
}
Andreas Friedel
sumber
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"}

mojtaba karimi
sumber
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);
Roland Roos
sumber