এএসপি.নেট কোর আইকনফিগারেশন ব্যবহার করে জসন অ্যারে পান


168

এপসেটেটিংস.জেসনে

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

স্টার্টআপ। সি

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

হোমকন্ট্রোলারে

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

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

উপরে আমার কোড আছে, আমি শূন্য পেলাম অ্যারে কিভাবে পাব?

উত্তর:


103

আপনি যদি প্রথম আইটেমটির মান বাছাই করতে চান তবে আপনার এটি করা উচিত-

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

আপনি যদি পুরো অ্যারের মান বাছাই করতে চান তবে আপনার এটি করা উচিত-

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

আদর্শভাবে, আপনি অফিসিয়াল ডকুমেন্টেশন দ্বারা প্রস্তাবিত বিকল্প প্যাটার্ন ব্যবহার বিবেচনা করা উচিত । এটি আপনাকে আরও সুবিধা দেবে।


23
আপনার মত বস্তুর একটি অ্যারে থাকলে "Clients": [ {..}, {..} ]আপনার আবেদন করা উচিত Configuration.GetSection("Clients").GetChildren()
হল্লো

39
আপনার কাছে যদি আক্ষরিক মতো একটি অ্যারে থাকে তবে আপনার আবেদন করা "Clients": [ "", "", "" ]উচিত .GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray()
হল্লো

6
এই উত্তরটি আসলে 4 টি আইটেম তৈরি করবে, প্রথমটি খালি মান সহ নিজেই বিভাগ। এটা ভুল।
জিওভান্নি বাসি

4
আমি সফলভাবে এটির অনুরোধ করছি:var clients = Configuration.GetSection("Clients").GetChildren() .Select(clientConfig => new Client { ClientId = clientConfig["ClientId"], ClientName = clientConfig["ClientName"], ... }) .ToArray();
হল্লো

1
এই বিকল্পগুলির কোনওোটাই আমার পক্ষে কাজ করে না কারণ হ্যালো উদাহরণ ব্যবহার করে "ক্লায়েন্ট" এর বিন্দুতে অবজেক্টটি ফিরে আসছে। আমি দৃ confident়বিশ্বাস নিয়েছি যে এটি জেসনের ভালভাবে গঠন করা হয়েছে কারণ এটি "আইটেম": বিন্যাসে স্ট্রিং ["আইটেম: 0: চাইল্ড আইটেম"] এ setোকানো অফসেটের সাথে কাজ করে: [{...}, {...}]
ক্লারেন্স

282

আপনি নিম্নলিখিত দুটি নিউগেট প্যাকেজ ইনস্টল করতে পারেন:

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

এবং তারপরে আপনার নিম্নলিখিত এক্সটেনশন পদ্ধতিটি ব্যবহার করার সম্ভাবনা থাকবে:

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

13
এটি অন্যান্য উত্তরের চেয়ে অনেক বেশি সোজা।
জাও

14
এটি এখন পর্যন্ত সেরা উত্তর।
জিওভান্নি বাসি

14
আমার ক্ষেত্রে, অ্যাস্পনেট কোর 2.1 ওয়েব অ্যাপ্লিকেশনটিতে এই দুটি নুগেট প্যাকেজ অন্তর্ভুক্ত রয়েছে। সুতরাং এটি শুধুমাত্র একটি লাইন পরিবর্তন ছিল। ধন্যবাদ
শিবু থান্নিক্কুনাথ

সবচেয়ে সহজ!
পাবলো

3
এটি বস্তুর অ্যারের সাথেও কাজ করে, যেমন _config.GetSection("AppUser").Get<AppUser[]>();
জিওরগোস বেটসোস

60

আপনার অ্যাপসেটেটিংজেসনে একটি স্তর যুক্ত করুন:

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

আপনার বিভাগটি উপস্থাপন করে একটি শ্রেণী তৈরি করুন:

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

আপনার অ্যাপ্লিকেশন প্রারম্ভিক শ্রেণিতে, আপনার মডেলটিকে ডিআই পরিষেবাতে একটি ইনজেকশন বেঁধে রাখুন:

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

এবং আপনার নিয়ামকের মধ্যে, ডিআই পরিষেবা থেকে আপনার কনফিগারেশন ডেটা পান:

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

এএসপি.এনইটি কোর এর নির্ভরতা ইনজেকশন পরিষেবা ঠিক একটি কবিতার মতো কাজ করে :)


আপনি কিভাবে MySettingsস্টার্টআপ ব্যবহার করবেন ?
টি.কাউটলাকিস

আমি একটি ত্রুটি পেয়েছি যে এটির জন্য "মাইসেটেটিং" এবং "মাইআরে" এর মধ্যে কমা দরকার।
মার্কাস

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 অবজেক্টগুলির একটি অ্যারের ফেরত দেওয়ার ক্ষেত্রে, আমি @ jangojazz এর উত্তরটিকে টিউপস না করে বেনামে টাইপ এবং ডায়নামিক ব্যবহারের জন্য গ্রহণ করেছি ।

এর একটি সেটিংস বিভাগ দেওয়া হয়েছে:

"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

পুরানো প্রশ্নের মতো তবে আমি উত্তর # সি # 7 মান দিয়ে নেট নেট 2.1 আপডেট করে দিতে পারি। বলুন আমার কাছে কেবল অ্যাপসেটেটিংগুলিতে একটি তালিকা রয়েছে e ডেভেলপমেন্ট.জসন যেমন:

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

মাইক্রোসফ্ট.এক্সটেনশনস.কনফিগারেশন.আই.সি. কনফিগারেশনটি যে কোনও জায়গায় প্রয়োগ করা হয়েছে এবং তার মতো ওয়্যার্ড আপ হয়েছে:

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

এখন আমি ভাল টাইপ করা একটি ভাল টাইপ করা অবজেক্টের একটি তালিকা আছে। আমি যদি পরীক্ষার্থী হয়ে যাই F


9

এএসপি.নেট কোর ২.২ এ এবং পরে আমরা আমাদের অ্যাপ্লিকেশনটিতে যে কোনও জায়গায় আইকনফিগারেশন ইনজেক্ট করতে পারি যেমন আপনার ক্ষেত্রে, আপনি হোম কন্ট্রোলারের মধ্যে আইকনফাইগ্রেশনটি ইনজেক্ট করতে পারেন এবং অ্যারে পেতে এটি ব্যবহার করতে পারেন।

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
আমার জন্য কাজ করেছেন। ধন্যবাদ। মাইক্রোসফ্ট.এক্সটেনশনগুলি. কনফিগারেশন.বাইন্ডার ব্যবহার করে খুব কার্যকর হয়, তবে আমি যদি একটি একক লাইনের কোড কাজ করতে পারি তবে অন্য নুগেট প্যাকেজটি উল্লেখ করা থেকে দূরে থাকতে চাই।
Sau001

3

এটি আমার পক্ষে কাজ করেছিল; কিছু জেসন ফাইল তৈরি করুন:

{
    "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.