ASP.NET Core Nhận Json Array bằng cách sử dụng IConfiguration


167

Trong appsinstall.json

{
      "MyArray": [
          "str1",
          "str2",
          "str3"
      ]
}

Trong Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     services.AddSingleton<IConfiguration>(Configuration);
}

Trong HomeContoder

public class HomeController : Controller
{
    private readonly IConfiguration _config;
    public HomeController(IConfiguration config)
    {
        this._config = config;
    }

    public IActionResult Index()
    {
        return Json(_config.GetSection("MyArray"));
    }
}

Có mã của tôi ở trên, tôi có null Làm thế nào để có được mảng?

Câu trả lời:


102

Nếu bạn muốn chọn giá trị của mục đầu tiên thì bạn nên làm như thế này-

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

Nếu bạn muốn chọn giá trị của toàn bộ mảng thì bạn nên làm như thế này-

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

Tốt nhất, bạn nên cân nhắc sử dụng mẫu tùy chọn được đề xuất bởi tài liệu chính thức. Điều này sẽ cung cấp cho bạn nhiều lợi ích hơn.


23
Nếu bạn có một mảng các đối tượng như thế "Clients": [ {..}, {..} ], bạn nên gọi Configuration.GetSection("Clients").GetChildren().
halllo

39
Nếu bạn có một loạt các chữ như thế "Clients": [ "", "", "" ], bạn nên gọi .GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray().
halllo

6
Câu trả lời này thực sự sẽ tạo ra 4 mục, đầu tiên là phần có giá trị trống. Nó không chính xác.
Giovanni Bassi

4
Tôi gọi nó thành công như thế này:var clients = Configuration.GetSection("Clients").GetChildren() .Select(clientConfig => new Client { ClientId = clientConfig["ClientId"], ClientName = clientConfig["ClientName"], ... }) .ToArray();
halllo

1
Không có tùy chọn nào trong số này làm việc cho tôi vì đối tượng sẽ trở lại null tại điểm "Khách hàng" bằng ví dụ của hội trường. Tôi tin rằng json được hình thành tốt khi nó hoạt động với phần bù được chèn trong chuỗi ["item: 0: childItem"] ở định dạng "Item": [{...}, {...}]
Clarence

281

Bạn có thể cài đặt hai gói NuGet sau:

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

Và sau đó bạn sẽ có khả năng sử dụng phương pháp tiện ích mở rộng sau:

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

13
Điều này là đơn giản hơn nhiều so với các câu trả lời khác.
jao

14
Đây là câu trả lời tốt nhất cho đến nay.
Giovanni Bassi

14
Trong trường hợp của tôi, ứng dụng web Aspnet core 2.1, bao gồm hai gói nuget này. Vì nó chỉ là một thay đổi dòng. Cảm ơn
Shibu Thannikkunnath

Đơn giản nhất!
Pablo

3
Nó cũng hoạt động với một loạt các đối tượng, ví dụ _config.GetSection("AppUser").Get<AppUser[]>();
Giorgos Betsos

60

Thêm một cấp độ trong appsinstall.json của bạn:

{
  "MySettings": {
    "MyArray": [
      "str1",
      "str2",
      "str3"
    ]
  }
}

Tạo một lớp đại diện cho phần của bạn:

public class MySettings
{
     public List<string> MyArray {get; set;}
}

Trong lớp khởi động ứng dụng của bạn, liên kết mô hình của bạn một mô hình tiêm trong dịch vụ DI:

services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));

Và trong bộ điều khiển của bạn, hãy lấy dữ liệu cấu hình của bạn từ dịch vụ 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);
    }
}

Bạn cũng có thể lưu trữ toàn bộ mô hình cấu hình của mình trong một thuộc tính trong bộ điều khiển của bạn, nếu bạn cần tất cả dữ liệu:

public class HomeController : Controller
{
    private readonly MySettings _mySettings;

    public HomeController(IOptions<MySettings> mySettings)
    {
        _mySettings = mySettings.Value;
    }

    public IActionResult Index()
    {
        return Json(_mySettings.MyArray);
    }
}

Dịch vụ tiêm phụ thuộc của ASP.NET Core hoạt động giống như một bùa mê :)


Vậy làm thế nào để bạn sử dụng MySettingstrong Startup?
T.Coutlakis

Tôi nhận được một lỗi rằng nó cần một dấu phẩy giữa "MySinstall" và "MyArray".
Markus

35

Nếu bạn có mảng các đối tượng JSON phức tạp như thế này:

{
  "MySettings": {
    "MyValues": [
      { "Key": "Key1", "Value":  "Value1" },
      { "Key": "Key2", "Value":  "Value2" }
    ]
  }
}

Bạn có thể truy xuất cài đặt theo cách này:

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

Điều này làm việc cho tôi để trả về một chuỗi các chuỗi từ cấu hình của tôi:

var allowedMethods = Configuration.GetSection("AppSettings:CORS-Settings:Allow-Methods")
    .Get<string[]>();

Phần cấu hình của tôi trông như thế này:

"AppSettings": {
    "CORS-Settings": {
        "Allow-Origins": [ "http://localhost:8000" ],
        "Allow-Methods": [ "OPTIONS","GET","HEAD","POST","PUT","DELETE" ]
    }
}

15

Đối với trường hợp trả về một mảng các đối tượng JSON phức tạp từ cấu hình, tôi đã điều chỉnh câu trả lời của @ djangojazz để sử dụng các loại ẩn danh và động thay vì các bộ dữ liệu.

Đưa ra một phần cài đặt của:

"TestUsers": [
{
  "UserName": "TestUser",
  "Email": "Test@place.com",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "Test2@place.com",
  "Password": "P@ssw0rd!"
}],

Bạn có thể trả về mảng đối tượng theo cách này:

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 };
}

Điều này thật tuyệt vời
Vladimir Demirev

11

Một loại câu hỏi cũ, nhưng tôi có thể đưa ra câu trả lời được cập nhật cho .NET Core 2.1 với tiêu chuẩn C # 7. Giả sử tôi chỉ có một danh sách trong apps settings.Development.json, chẳng hạn như:

"TestUsers": [
  {
    "UserName": "TestUser",
    "Email": "Test@place.com",
    "Password": "P@ssw0rd!"
  },
  {
    "UserName": "TestUser2",
    "Email": "Test2@place.com",
    "Password": "P@ssw0rd!"
  }
]

Tôi có thể trích xuất chúng ở bất cứ đâu mà Microsoft.Extensions.Configuration.IConfiguration được triển khai và kết nối như vậy:

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)>();

Bây giờ tôi có một danh sách các đối tượng được gõ tốt được gõ tốt. Nếu tôi đi testUsers.First (), Visual Studio sẽ hiển thị các tùy chọn cho 'Tên người dùng', 'Email' và 'Mật khẩu'.


9

Trong ASP.NET Core 2.2 trở lên, chúng ta có thể tiêm IConfiguration ở bất cứ đâu trong ứng dụng của chúng ta như trong trường hợp của bạn, bạn có thể tiêm IConfiguration trong HomeContoder và sử dụng như thế này để lấy mảng.

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

5

Bạn có thể lấy mảng trực tiếp mà không tăng cấp độ mới trong cấu hình:

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

4

Hình thức ngắn:

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

Nó trả về một chuỗi các chuỗi:

{"str1", "str2", "str3"}


1
Đã làm cho tôi. Cảm ơn. Sử dụng Microsoft.Extensions.Configuration.Binder cũng hoạt động, tuy nhiên tôi muốn tránh tham chiếu một gói Nuget khác nếu một dòng mã có thể thực hiện công việc.
Sau001

3

Điều này làm việc cho tôi; Tạo một số tệp json:

{
    "keyGroups": [
        {
            "Name": "group1",
            "keys": [
                "user3",
                "user4"
            ]
        },
        {
            "Name": "feature2And3",
            "keys": [
                "user3",
                "user4"
            ]
        },
        {
            "Name": "feature5Group",
            "keys": [
                "user5"
            ]
        }
    ]
}

Sau đó, định nghĩa một số lớp ánh xạ:

public class KeyGroup
{
    public string name { get; set; }
    public List<String> keys { get; set; }
}

gói nuget:

Microsoft.Extentions.Configuration.Binder 3.1.3
Microsoft.Extentions.Configuration 3.1.3
Microsoft.Extentions.Configuration.json 3.1.3

Sau đó, tải nó:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.