304 votes

ASP.NET Core Obtenir un tableau Json en utilisant IConfiguration

Dans appsettings.json

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

Dans Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     services.AddSingleton(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"));
    }
}

Voici mes codes ci-dessus, j'ai obtenu null Comment obtenir le tableau ?

553voto

Razvan Dumitru Points 3865

Vous pouvez installer les deux packages NuGet suivants :

using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.Configuration.Binder;

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

var myArray = _config.GetSection("MyArray").Get();

24 votes

Il s'agit d'une réponse beaucoup plus simple que les autres.

24 votes

C'est de loin la meilleure réponse.

20 votes

Dans mon cas, l'application web Aspnet core 2.1 inclus ces deux packages NuGet. Donc, c'était juste un changement d'une ligne. Merci

174voto

Sanket Points 11785

Si vous voulez choisir la valeur du premier élément, vous devriez faire comme ceci -

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

Si vous voulez choisir la valeur de tout le tableau, vous devriez faire comme ceci -

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

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

48 votes

Si vous avez un tableau d'objets comme "Clients": [ {..}, {..} ], vous devriez invoquer Configuration.GetSection("Clients").GetChildren().

86 votes

Si vous avez un tableau de littéraux comme "Clients": [ "", "", "" ], vous devriez invoquer .GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray().

14 votes

Cette réponse produira en réalité 4 éléments, le premier étant la section elle-même avec une valeur vide. C'est incorrect.

84voto

AdrienTorris Points 4144

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 MyArray {get; set;}
}

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

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

Et dans votre contrôleur, récupérez vos données de configuration depuis le service DI :

public class HomeController : Controller
{
    private readonly List _myArray;

    public HomeController(IOptions mySettings)
    {
        _myArray = mySettings.Value.MyArray;
    }

    public IActionResult Index()
    {
        return Json(_myArray);
    }
}

Vous pouvez également stocker l'ensemble 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.Value;
    }

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

Le service d'injection de dépendance d'ASP.NET Core fonctionne à merveille :)

0 votes

Je reçois une erreur indiquant qu'il manque une virgule entre "MySettings" et "MyArray".

0 votes

Merci pour l'info. Je crois que cela répond le mieux à la question initiale.

1 votes

Que se passe-t-il si au lieu d'un simple tableau de chaînes, il s'agit d'un tableau de tableaux? Par exemple, ce tableau de définitions de rapports et je veux récupérer le tableau cols pour chaque rapport: "reports": [ {"name":"reportA", "id": "1", "cols": [{"order":"1","name":"empid"},{"order":"2","name":"firstname‌​"}]}, {"name":"reportB", "id": "2"}, "cols": [{"order":"1","name":"typeID"},{"order":"2","name":"descript‌​ion"}]]

67voto

Dmitry Pavlov Points 2260

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 manière :

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

3 votes

Exactement ce que je cherchais, a fonctionné à merveille merci!

1 votes

Simple et direct !

43voto

CodeThief Points 61

Cela a fonctionné pour moi pour retourner un tableau de chaînes à partir de ma configuration :

var allowedMethods = Configuration.GetSection("AppSettings:CORS-Settings:Allow-Methods")
    .Get();

Ma section de configuration ressemble à ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X