ASP.NET Core IConfigurationを使用したJson配列の取得


167

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を取得しました配列を取得する方法?

回答:


102

最初の項目の値を選択する場合は、次のようにする必要があります-

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

配列全体の値を取得する場合は、次のようにする必要があります-

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

理想的には、公式ドキュメントで提案されているオプションパターンの使用を検討する必要があります。これにより、より多くのメリットが得られます。


23
のようなオブジェクトの配列がある場合は"Clients": [ {..}, {..} ]、を呼び出す必要がありConfiguration.GetSection("Clients").GetChildren()ます。
Halllo

39
のようなリテラルの配列がある場合は、"Clients": [ "", "", "" ]を呼び出す必要があり.GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray()ます。
Halllo

6
この答えは実際には4つの項目を生成します。最初の項目は空の値を持つセクション自体です。間違いです。
Giovanni Bassi

4
私はこれを次のように正常に呼び出しますvar clients = Configuration.GetSection("Clients").GetChildren() .Select(clientConfig => new Client { ClientId = clientConfig["ClientId"], ClientName = clientConfig["ClientName"], ... }) .ToArray();
。– Halllo

1
Halloの例を使用すると、「クライアント」の時点でオブジェクトがnullに戻るため、これらのオプションはどれも機能しません。「Item」:[{...}、{...}]という形式の文字列["item:0:childItem"]に挿入されたオフセットで機能するため、jsonは整形式であると確信しています
クラレンス

281

次の2つのNuGetパッケージをインストールできます。

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

そして、次の拡張メソッドを使用する可能性があります。

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

13
これは他の答えよりもはるかに簡単です。
jao

14
これは断然最良の答えです。
Giovanni Bassi

14
私の場合、Aspnet core 2.1 Webアプリには、これら2つのnugetパッケージが含まれていました。SOは、たった1行の変更でした。ありがとう
Shibu Thannikkunnath 2018

最も簡単なもの!
パブロ

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、スタートアップではどのように使用しますか?
T.Coutlakis

「MySettings」と「MyArray」の間にカンマが必要であるというエラーが表示されます。
Markus

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

古い質問のようなものですが、C#7標準の.NET Core 2.1用に更新された回答を提供できます。次のような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は 'UserName'、 'Email'、および 'Password'のオプションを表示するはずです。


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を使用 することもできますが、1行のコードで処理できる場合は、別の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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.