web-dev-qa-db-fra.com

ASP.NET Core Obtenir Json Array en utilisant IConfiguration

Dans appsettings.json

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

Dans Startup.cs

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

Dans HomeController

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

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

Il y a mes codes ci-dessus, je suis nullComment obtenir le tableau?

76
Gary

Si vous voulez choisir la valeur du premier article, faites comme ceci -

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

Si vous voulez choisir la valeur d'un tableau entier, faites comme ceci:

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

Idéalement, vous devriez envisager d'utiliser modèle d'options suggéré par la documentation officielle. Cela vous donnera plus d'avantages.

49
Sanket

Vous pouvez installer les deux packages NuGet suivants: 

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

Et vous aurez ensuite la possibilité d'utiliser la méthode d'extension suivante: 

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

Ajoutez un niveau dans votre appsettings.json:

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

Créez une classe représentant votre section:

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

Dans votre classe de démarrage d’application, liez votre modèle et injectez-le dans le service DI:

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

Et dans votre contrôleur, obtenez vos données de configuration auprès du service 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);
    }
}

Vous pouvez également stocker l'intégralité de votre modèle de configuration dans une propriété de votre contrôleur, si vous avez besoin de toutes les données:

public class HomeController : Controller
{
    private readonly MySettings _mySettings;

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

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

Le service d'injection de dépendance du noyau ASP.NET fonctionne comme un charme :)

32
AdrienTorris

Si vous avez un tableau d'objets JSON complexes comme celui-ci:

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

Vous pouvez récupérer les paramètres de cette façon:

var valuesSection = configuration.GetSection("MySettings:MyValues");
foreach (IConfigurationSection section in valuesSection.GetChildren())
{
    var key = section.GetValue<string>("Key");
    var value = section.GetValue<string>("Value");
}
17
Dmitry Pavlov

Cela a fonctionné pour moi pour retourner un tableau de chaînes de ma config:

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

Ma section de configuration ressemble à ceci:

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

Dans ASP.NET Core 2.2 et versions ultérieures, nous pouvons injecter IConfiguration n'importe où dans notre application, comme dans votre cas. Vous pouvez injecter IConfiguration dans HomeController et l'utiliser comme ceci pour obtenir le tableau.

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

C'est une vieille question, mais je peux donner une réponse mise à jour pour .NET Core 2.1 avec les normes C # 7. Dites que je possède une liste uniquement dans appsettings.Development.json, par exemple:

"TestUsers": [
{
  "UserName": "TestUser",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
}

],

Je peux les extraire n'importe où que Microsoft.Extensions.Configuration.IConfiguration soit implémenté et câblé comme suit:

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

Maintenant, j'ai la liste d'un objet bien typé et bien typé. Si j'utilise testUsers.First (), Visual Studio doit maintenant afficher les options pour 'Nom d'utilisateur', 'E-mail' et 'Mot de passe'.

2
djangojazz

Vous pouvez obtenir le tableau directement sans incrémenter un nouveau niveau dans la configuration:

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

Pour le cas du retour d'un tableau d'objets JSON complexes à partir de la configuration, j'ai adapté la réponse de @ djangojazz afin d'utiliser des types anonymes et dynamiques plutôt que des tuples. 

Étant donné une section de paramètres de:

"TestUsers": [
{
  "UserName": "TestUser",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
}],

Vous pouvez retourner le tableau d'objets de cette façon:

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

Forme courte:

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

Il retourne un tableau de chaîne: 

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

0
mojtaba karimi