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

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이 있습니다. 어떻게 배열을 얻는가?



답변

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

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

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

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

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


답변

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

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

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

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


답변

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의 의존성 주입 서비스는 매력처럼 작동합니다 🙂


답변

다음과 같이 복잡한 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");
}


답변

이것은 구성에서 문자열 배열을 반환하는 데 효과적이었습니다.

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" ]
    }
}


답변

구성에서 복잡한 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 };
}


답변

오래된 질문이지만 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’에 대한 옵션을 표시해야합니다.