ASP.NET Core รับ Json Array โดยใช้ IConfiguration


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 ฉันมั่นใจว่ารูปแบบที่ดีของ json นั้นใช้ได้กับอ็อฟเซ็ตที่แทรกในสตริง ["item: 0: childItem"] ในรูปแบบ "Item": [{... }, {... }]
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 ทั้งสองนี้ ดังนั้นมันจึงเป็นการเปลี่ยนแปลงบรรทัดเดียว ขอบคุณ
Shibu Thannikkunnath

ที่ง่ายที่สุด!
ปาโบล

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

สิ่งนี้ใช้ได้สำหรับฉันที่จะส่งคืนอาร์เรย์ของสตริงจาก config ของฉัน:

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

นี่มันสุดยอดมาก
Vladimir Demirev

11

เป็นคำถามแบบเก่า แต่ฉันสามารถให้คำตอบที่อัพเดตสำหรับ. NET Core 2.1 ที่มีมาตรฐาน C # 7 บอกว่าฉันมีรายชื่อเฉพาะใน 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 ควรแสดงตัวเลือกสำหรับ 'ชื่อผู้ใช้', 'อีเมล' และ 'รหัสผ่าน'


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 ก็ทำงานได้ดีเหมือนกัน แต่ฉันก็อยากอยู่ห่างจากการอ้างอิงแพ็กเกจ 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.