web-dev-qa-db-ja.com

ASP.NET Core IConfigurationを使用してJsonアレイを入手する

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

103
Gary

あなたが最初の項目の値を選びたいなら、あなたはこのようにするべきです -

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

あなたが全体の配列の値を選びたいなら、あなたはこのようにするべきです -

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

理想的には、公式文書で提案されている options pattern の使用を検討するべきです。これはあなたにもっと利益を与えます。

60
Sanket

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

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

そして、次のような拡張方法を使うことができます。

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

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の依存性注入サービスは、魅力のように機能します。

43
AdrienTorris

このような複雑な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");
}
23
Dmitry Pavlov

これは私の設定から文字列の配列を返すために私のために働いた:

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
CodeThief

構成から複雑なJSONオブジェクトの配列を返す場合は、 @ djangojazz's answer をタプルではなく匿名型と動的型を使用するように調整しました。

次の設定セクションがあるとします。

"TestUsers": [
{
  "UserName": "TestUser",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "[email protected]",
  "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 };
}
5
jaycer

古い質問ですが、C#7標準の.NET Core 2.1用に更新された答えを出すことができます。次のようなappsettings.Development.jsonにのみリストがあるとします。

"TestUsers": [
{
  "UserName": "TestUser",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "[email protected]",
  "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'のオプションを表示するはずです。

4
djangojazz

ASP.NET Core 2.2以降では、アプリケーションのどこにでもIConfigurationを挿入できます。たとえば、HomeControllerにIConfigurationを挿入し、これを使用して配列を取得できます。

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

設定で新しいレベルを増やさずに直接配列を取得できます。

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

ショートフォーム:

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

文字列の配列を返します。

{"str1"、 "str2"、 "str3"}

1
mojtaba karimi