IConfiguration을 사용하여 ASP.NET Core Get Json Array


168

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

첫 번째 항목의 값을 선택하려면 다음과 같이해야합니다.

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

전체 배열의 값을 선택하려면 다음과 같이해야합니다.

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

이상적으로 는 공식 문서에서 제안한 옵션 패턴 사용 고려해야 합니다. 이것은 당신에게 더 많은 혜택을 줄 것입니다.


23
와 같은 객체 배열 "Clients": [ {..}, {..} ]이 있으면를 호출해야합니다 Configuration.GetSection("Clients").GetChildren().
halllo

40
와 같은 리터럴 배열이 있으면를 "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이 잘 구성되어 있다고 확신합니다.
Clarence

283

다음 두 가지 NuGet 패키지를 설치할 수 있습니다.

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

그런 다음 다음 확장 방법을 사용할 수 있습니다.

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

13
이것은 다른 답변보다 훨씬 간단합니다.
jao

14
이것이 가장 좋은 답변입니다.
Giovanni Bassi

15
필자의 경우 Aspnet core 2.1 웹 앱에는이 두 가지 nuget 패키지가 포함되었습니다. 그래서 그것은 단지 한 줄의 변화였습니다. 감사합니다
시부 Thannikkunnath

가장 간단한 것!
Pablo

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을 주입 할 수 있으며 HomeController에 IConfiguration을 주입하고 이와 같이 사용하여 배열을 얻을 수 있습니다.

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 사용도 작동하지만 한 줄의 코드로 작업을 수행 할 수있는 경우 다른 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; }
}

너겟 패키지 :

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.